Changeset 26227
- Timestamp:
- 04/30/21 12:33:54 (4 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 2 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/Makefile.am
r26222 r26227 559 559 ./cores/sealevelchange_core.cpp \ 560 560 ./analyses/SealevelchangeAnalysis.cpp\ 561 ./classes/GrdLoads.cpp\ 561 562 ./classes/SealevelGeometry.cpp 562 563 -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r26222 r26227 31 31 class DatasetInput; 32 32 class IoModel; 33 class SealevelMasks;34 33 class SealevelGeometry; 35 34 class Gauss; 35 class GrdLoads; 36 36 class ElementVector; 37 37 template <class doublematrix> class Matrix; … … 391 391 392 392 virtual void SealevelchangeGeometryFractionKernel(SealevelGeometry* slgeom)=0; 393 virtual void SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, IssmDouble* loads, IssmDouble* sealevelloads, SealevelGeometry* slgeom)=0;394 virtual void SealevelchangeShift( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementloads, IssmDouble offset, SealevelGeometry* slgeom)=0;393 virtual void SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom)=0; 394 virtual void SealevelchangeShift(GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom)=0; 395 395 virtual void SealevelchangeGeometryInitial(IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae)=0; 396 396 virtual void SealevelchangeGeometryCentroidLoads(SealevelGeometry* slgeom, IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae)=0; 397 397 virtual void SealevelchangeGeometrySubElementLoads(SealevelGeometry* slgeom, IssmDouble* areae)=0; 398 virtual void SealevelchangeBarystaticLoads( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementiceloads, Vector<IssmDouble>* subelementhydroloads, Vector<IssmDouble>* subelementbploads, BarystaticContributions* barycontrib, SealevelGeometry* slgeom)=0;399 virtual void SealevelchangeConvolution( Vector<IssmDouble>* sealevelloads, Vector<IssmDouble>* subelementsealevelloads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* allsealevelloads, IssmDouble* allloads,IssmDouble* allsubelementiceloads, IssmDouble* allsubelementhydroloads, IssmDouble* allsubelementbploads, IssmDouble* allsubelementsealevelloads, IssmDouble* rotationvector,SealevelGeometry* slgeom)=0;400 virtual void SealevelchangeDeformationConvolution( IssmDouble* sealevelloads, IssmDouble* subelementsealevelloads, IssmDouble* loads, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* rotationvector,SealevelGeometry* slgeom)=0;401 virtual void SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* subelementsealevelloads, SealevelGeometry* slgeom)=0;398 virtual void SealevelchangeBarystaticLoads(GrdLoads* loads, BarystaticContributions* barycontrib, SealevelGeometry* slgeom)=0; 399 virtual void SealevelchangeConvolution(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* rotationvector,SealevelGeometry* slgeom)=0; 400 virtual void SealevelchangeDeformationConvolution(GrdLoads* loads, IssmDouble* rotationvector,SealevelGeometry* slgeom)=0; 401 virtual void SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom)=0; 402 402 #endif 403 403 -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r26222 r26227 224 224 void GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,Matlitho* litho, IssmDouble* x,IssmDouble* y){_error_("not implemented yet");}; 225 225 void SealevelchangeGeometryFractionKernel(SealevelGeometry* slgeom){_error_("not implemented yet");}; 226 void SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, IssmDouble* loads, IssmDouble* sealevelloads,SealevelGeometry* slgeom){_error_("not implemented yet");};227 void SealevelchangeShift( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementloads,IssmDouble offset, SealevelGeometry* slgeom){_error_("not implemented yet");};226 void SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){_error_("not implemented yet");}; 227 void SealevelchangeShift(GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom){_error_("not implemented yet");}; 228 228 void SealevelchangeGeometryInitial(IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae){_error_("not implemented yet");}; 229 229 void SealevelchangeGeometryCentroidLoads(SealevelGeometry* slgeom, IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae){_error_("not implemented yet");}; 230 230 void SealevelchangeGeometrySubElementLoads(SealevelGeometry* slgeom, IssmDouble* areae){_error_("not implemented yet");}; 231 void SealevelchangeBarystaticLoads( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementiceloads, Vector<IssmDouble>* subelementhydroloads, Vector<IssmDouble>* subelementbploads,BarystaticContributions* barycontrib, SealevelGeometry* slgeom){_error_("not implemented yet");};232 void SealevelchangeConvolution( Vector<IssmDouble>* sealevelloads, Vector<IssmDouble>* subelementsealevelloads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* allsealevelloads, IssmDouble* allloads,IssmDouble* allsubelementiceloads, IssmDouble* allsubelementhydroloads, IssmDouble* allsubelementbploads, IssmDouble* allsubelementsealevelloads, IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");};233 void SealevelchangeDeformationConvolution( IssmDouble* sealevelloads, IssmDouble* subelementsealevelloads, IssmDouble* loads, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads,IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");};234 void SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* subelementsealevelloads, SealevelGeometry* slgeom){_error_("not implemented yet");};231 void SealevelchangeBarystaticLoads(GrdLoads* loads, BarystaticContributions* barycontrib, SealevelGeometry* slgeom){_error_("not implemented yet");}; 232 void SealevelchangeConvolution(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");}; 233 void SealevelchangeDeformationConvolution(GrdLoads* loads, IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");}; 234 void SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){_error_("not implemented yet");}; 235 235 #endif 236 236 -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r26222 r26227 179 179 void GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,Matlitho* litho, IssmDouble* x,IssmDouble* y){_error_("not implemented yet");}; 180 180 void SealevelchangeGeometryFractionKernel(SealevelGeometry* slgeom){_error_("not implemented yet");}; 181 void SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, IssmDouble* loads, IssmDouble* sealevelloads,SealevelGeometry* slgeom){_error_("not implemented yet");};182 void SealevelchangeShift( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementloads, IssmDouble offset, SealevelGeometry* slgeom){_error_("not implemented yet");};181 void SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){_error_("not implemented yet");}; 182 void SealevelchangeShift(GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom){_error_("not implemented yet");}; 183 183 void SealevelchangeGeometryInitial(IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae){_error_("not implemented yet");}; 184 184 void SealevelchangeGeometryCentroidLoads(SealevelGeometry* slgeom, IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae){_error_("not implemented yet");}; 185 185 void SealevelchangeGeometrySubElementLoads(SealevelGeometry* slgeom, IssmDouble* areae){_error_("not implemented yet");}; 186 void SealevelchangeBarystaticLoads( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementiceloads, Vector<IssmDouble>* subelementhydroloads, Vector<IssmDouble>* subelementbploads,BarystaticContributions* barycontrib, SealevelGeometry* slgeom){_error_("not implemented yet");};187 void SealevelchangeConvolution( Vector<IssmDouble>* sealevelloads, Vector<IssmDouble>* subelementsealevelloads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* allsealevelloads, IssmDouble* allloads,IssmDouble* allsubelementiceloads, IssmDouble* allsubelementhydroloads, IssmDouble* allsubelementbploads, IssmDouble* allsubelementsealevelloads,IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");};188 void SealevelchangeDeformationConvolution( IssmDouble* sealevelloads, IssmDouble* subelementsealevelloads, IssmDouble* loads, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");};189 void SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* subelementsealevelloads, SealevelGeometry* slgeom){_error_("not implemented yet");};186 void SealevelchangeBarystaticLoads(GrdLoads* loads, BarystaticContributions* barycontrib, SealevelGeometry* slgeom){_error_("not implemented yet");}; 187 void SealevelchangeConvolution(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");}; 188 void SealevelchangeDeformationConvolution(GrdLoads* loads, IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");}; 189 void SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){_error_("not implemented yet");}; 190 190 #endif 191 191 -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r26222 r26227 186 186 void GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt, Matlitho* litho, IssmDouble* x,IssmDouble* y){_error_("not implemented yet");}; 187 187 void SealevelchangeGeometryFractionKernel(SealevelGeometry* slgeom){_error_("not implemented yet");}; 188 void SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, IssmDouble* loads, IssmDouble* sealevelloads,SealevelGeometry* slgeom){_error_("not implemented yet");};189 void SealevelchangeShift( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementloads,IssmDouble offset, SealevelGeometry* slgeom){_error_("not implemented yet");};188 void SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){_error_("not implemented yet");}; 189 void SealevelchangeShift(GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom){_error_("not implemented yet");}; 190 190 void SealevelchangeGeometryInitial(IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae){_error_("not implemented yet");}; 191 191 void SealevelchangeGeometryCentroidLoads(SealevelGeometry* slgeom, IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae){_error_("not implemented yet");}; 192 192 void SealevelchangeGeometrySubElementLoads(SealevelGeometry* slgeom, IssmDouble* areae){_error_("not implemented yet");}; 193 void SealevelchangeBarystaticLoads( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementiceloads, Vector<IssmDouble>* subelementhydroloads, Vector<IssmDouble>* subelementbploads, BarystaticContributions* barycontrib, SealevelGeometry* slgeom){_error_("not implemented yet");};194 void SealevelchangeConvolution( Vector<IssmDouble>* sealevelloads, Vector<IssmDouble>* subelementsealevelloads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* allsealevelloads, IssmDouble* allloads,IssmDouble* allsubelementiceloads, IssmDouble* allsubelementhydroloads, IssmDouble* allsubelementbploads, IssmDouble* allsubelementsealevelloads,IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");};195 void SealevelchangeDeformationConvolution( IssmDouble* sealevelloads, IssmDouble* subelementsealevelloads, IssmDouble* loads, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads,IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");};196 void SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* subelementsealevelloads, SealevelGeometry* slgeom){_error_("not implemented yet");};193 void SealevelchangeBarystaticLoads(GrdLoads* loads, BarystaticContributions* barycontrib, SealevelGeometry* slgeom){_error_("not implemented yet");}; 194 void SealevelchangeConvolution(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");}; 195 void SealevelchangeDeformationConvolution(GrdLoads* loads, IssmDouble* rotationvector,SealevelGeometry* slgeom){_error_("not implemented yet");}; 196 void SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){_error_("not implemented yet");}; 197 197 #endif 198 198 -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r26223 r26227 6806 6806 } 6807 6807 /*}}}*/ 6808 void Tria::SealevelchangeBarystaticLoads( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementiceloads, Vector<IssmDouble>* subelementhydroloads, Vector<IssmDouble>* subelementbploads,BarystaticContributions* barycontrib, SealevelGeometry* slgeom){ /*{{{*/6808 void Tria::SealevelchangeBarystaticLoads(GrdLoads* loads, BarystaticContributions* barycontrib, SealevelGeometry* slgeom){ /*{{{*/ 6809 6809 6810 6810 /*Inputs:*/ … … 6863 6863 if(slgeom->issubelement[SLGEOM_ICE][this->lid]){ 6864 6864 int intj=slgeom->subelementmapping[SLGEOM_ICE][this->lid]; 6865 subelementiceloads->SetValue(intj,Iavg,INS_VAL);6865 loads->vsubloads[SLGEOM_ICE]->SetValue(intj,Iavg,INS_VAL); 6866 6866 Iavg=0; //avoid double counting centroid loads and subelement loads! 6867 6867 } 6868 6868 if(slgeom->issubelement[SLGEOM_WATER][this->lid]){ 6869 6869 int intj=slgeom->subelementmapping[SLGEOM_WATER][this->lid]; 6870 subelementhydroloads->SetValue(intj,Wavg,INS_VAL);6870 loads->vsubloads[SLGEOM_WATER]->SetValue(intj,Wavg,INS_VAL); 6871 6871 Wavg=0; 6872 6872 } 6873 6873 if(slgeom->issubelement[SLGEOM_OCEAN][this->lid]){ 6874 6874 int intj=slgeom->subelementmapping[SLGEOM_OCEAN][this->lid]; 6875 subelementbploads->SetValue(intj,BPavg,INS_VAL);6875 loads->vsubloads[SLGEOM_OCEAN]->SetValue(intj,BPavg,INS_VAL); 6876 6876 BPavg=0; 6877 6877 } 6878 6878 /*Plug remaining values into centroi load vector:*/ 6879 loads-> SetValue(this->sid,Iavg+Wavg+BPavg,INS_VAL);6879 loads->vloads->SetValue(this->sid,Iavg+Wavg+BPavg,INS_VAL); 6880 6880 6881 6881 /*Keep track of barystatic contributions:*/ … … 6884 6884 } 6885 6885 /*}}}*/ 6886 void Tria::SealevelchangeConvolution( Vector<IssmDouble>* sealevelloads, Vector<IssmDouble>* subelementsealevelloads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* allsealevelloads, IssmDouble* allloads,IssmDouble* allsubelementiceloads, IssmDouble* allsubelementhydroloads, IssmDouble* allsubelementbploads, IssmDouble* allsubelementsealevelloads, IssmDouble* rotationvector,SealevelGeometry* slgeom){ /*{{{*/6886 void Tria::SealevelchangeConvolution(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* rotationvector,SealevelGeometry* slgeom){ /*{{{*/ 6887 6887 6888 6888 /*sal green function:*/ 6889 6889 IssmDouble* G=NULL; 6890 IssmDouble* GsubelIce=NULL; 6891 IssmDouble* GsubelHydro=NULL; 6892 IssmDouble* GsubelOcean=NULL; 6890 IssmDouble* Gsub[SLGEOM_NUMLOADS]; 6893 6891 IssmDouble SealevelGRD[NUMVERTICES]={0}; 6894 6892 IssmDouble oceanaverage=0; … … 6919 6917 if(sal){ 6920 6918 this->inputs->GetArrayPtr(SealevelchangeGEnum,this->lid,&G,&size); 6921 this->inputs->GetArrayPtr(SealevelchangeGsubelIceEnum,this->lid,&GsubelIce,&size); 6922 this->inputs->GetArrayPtr(SealevelchangeGsubelHydroEnum,this->lid,&GsubelHydro,&size); 6923 this->inputs->GetArrayPtr(SealevelchangeGsubelOceanEnum,this->lid,&GsubelOcean,&size); 6924 6925 if(allsealevelloads){ 6926 for(int i=0;i<NUMVERTICES;i++) { 6927 for (int e=0;e<nel;e++){ 6928 SealevelGRD[i]+=G[i*nel+e]*(allsealevelloads[e]+allloads[e]); 6929 } 6930 nbar=slgeom->nbar[SLGEOM_ICE]; 6931 for (int e=0;e<nbar;e++){ 6932 SealevelGRD[i]+=GsubelIce[i*nbar+e]*(allsubelementiceloads[e]); 6933 } 6934 nbar=slgeom->nbar[SLGEOM_WATER]; 6935 for (int e=0;e<nbar;e++){ 6936 SealevelGRD[i]+=GsubelHydro[i*nbar+e]*(allsubelementhydroloads[e]); 6937 } 6938 nbar=slgeom->nbar[SLGEOM_OCEAN]; 6939 for (int e=0;e<nbar;e++){ 6940 SealevelGRD[i]+=GsubelOcean[i*nbar+e]*(allsubelementbploads[e]+allsubelementsealevelloads[e]); 6941 } 6942 } 6943 } 6944 else{ //this is the initial convolution where only loads are provided 6945 for(int i=0;i<NUMVERTICES;i++) { 6946 for (int e=0;e<nel;e++){ 6947 SealevelGRD[i]+=G[i*nel+e]*(allloads[e]); 6948 } 6949 nbar=slgeom->nbar[SLGEOM_ICE]; 6950 for (int e=0;e<nbar;e++){ 6951 SealevelGRD[i]+=GsubelIce[i*nbar+e]*(allsubelementiceloads[e]); 6952 } 6953 nbar=slgeom->nbar[SLGEOM_WATER]; 6954 for (int e=0;e<nbar;e++){ 6955 SealevelGRD[i]+=GsubelHydro[i*nbar+e]*(allsubelementhydroloads[e]); 6956 } 6957 nbar=slgeom->nbar[SLGEOM_OCEAN]; 6958 for (int e=0;e<nbar;e++){ 6959 SealevelGRD[i]+=GsubelOcean[i*nbar+e]*(allsubelementbploads[e]); 6960 } 6961 } 6962 } 6919 this->inputs->GetArrayPtr(SealevelchangeGsubelIceEnum,this->lid,&Gsub[SLGEOM_ICE],&size); 6920 this->inputs->GetArrayPtr(SealevelchangeGsubelHydroEnum,this->lid,&Gsub[SLGEOM_WATER],&size); 6921 this->inputs->GetArrayPtr(SealevelchangeGsubelOceanEnum,this->lid,&Gsub[SLGEOM_OCEAN],&size); 6922 6923 this->SealevelchangeGxL(&SealevelGRD[0],G, Gsub, loads, slgeom, nel); 6963 6924 } 6964 6925 … … 6975 6936 if(slgeom->issubelement[SLGEOM_OCEAN][this->lid]){ 6976 6937 int intj=slgeom->subelementmapping[SLGEOM_OCEAN][this->lid]; 6977 subelementsealevelloads->SetValue(intj,oceanaverage*rho_water,INS_VAL);6978 } 6979 else sealevelloads->SetValue(this->sid,oceanaverage*rho_water,INS_VAL);6980 6981 if(! allsealevelloads){6938 loads->vsubsealevelloads->SetValue(intj,oceanaverage*rho_water,INS_VAL); 6939 } 6940 else loads->vsealevelloads->SetValue(this->sid,oceanaverage*rho_water,INS_VAL); 6941 6942 if(!loads->sealevelloads){ 6982 6943 oceanareas->SetValue(this->sid,oceanarea,INS_VAL); 6983 6944 if(slgeom->issubelement[SLGEOM_OCEAN][this->lid]){ … … 6990 6951 return; 6991 6952 } /*}}}*/ 6992 void Tria::SealevelchangeDeformationConvolution( IssmDouble* sealevelloads, IssmDouble* subelementsealevelloads, IssmDouble* loads, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* rotationvector,SealevelGeometry* slgeom){ /*{{{*/6953 void Tria::SealevelchangeDeformationConvolution(GrdLoads* loads, IssmDouble* rotationvector,SealevelGeometry* slgeom){ /*{{{*/ 6993 6954 6994 6955 IssmDouble Sealevel[3]={0,0,0}; … … 7003 6964 IssmDouble* GE=NULL; 7004 6965 IssmDouble* GN=NULL; 7005 IssmDouble* GsubelIce=NULL; 7006 IssmDouble* GsubelHydro=NULL; 7007 IssmDouble* GsubelOcean=NULL; 7008 IssmDouble* GUsubelIce=NULL; 7009 IssmDouble* GUsubelHydro=NULL; 7010 IssmDouble* GUsubelOcean=NULL; 7011 IssmDouble* GNsubelIce=NULL; 7012 IssmDouble* GNsubelHydro=NULL; 7013 IssmDouble* GNsubelOcean=NULL; 7014 IssmDouble* GEsubelIce=NULL; 7015 IssmDouble* GEsubelHydro=NULL; 7016 IssmDouble* GEsubelOcean=NULL; 6966 IssmDouble* Gsub[SLGEOM_NUMLOADS]; 6967 IssmDouble* GUsub[SLGEOM_NUMLOADS]; 6968 IssmDouble* GNsub[SLGEOM_NUMLOADS]; 6969 IssmDouble* GEsub[SLGEOM_NUMLOADS]; 7017 6970 7018 6971 int horiz; … … 7039 6992 7040 6993 if(sal){ 6994 7041 6995 this->inputs->GetArrayPtr(SealevelchangeGEnum,this->lid,&G,&size); 7042 this->inputs->GetArrayPtr(SealevelchangeGsubelIceEnum,this->lid,&GsubelIce,&size); 7043 this->inputs->GetArrayPtr(SealevelchangeGsubelHydroEnum,this->lid,&GsubelHydro,&size); 7044 this->inputs->GetArrayPtr(SealevelchangeGsubelOceanEnum,this->lid,&GsubelOcean,&size); 6996 this->inputs->GetArrayPtr(SealevelchangeGsubelIceEnum,this->lid,&Gsub[SLGEOM_ICE],&size); 6997 this->inputs->GetArrayPtr(SealevelchangeGsubelHydroEnum,this->lid,&Gsub[SLGEOM_WATER],&size); 6998 this->inputs->GetArrayPtr(SealevelchangeGsubelOceanEnum,this->lid,&Gsub[SLGEOM_OCEAN],&size); 6999 7045 7000 if(elastic){ 7046 7001 this->inputs->GetArrayPtr(SealevelchangeGUEnum,this->lid,&GU,&size); 7047 this->inputs->GetArrayPtr(SealevelchangeGUsubelIceEnum,this->lid,&GUsub elIce,&size);7048 this->inputs->GetArrayPtr(SealevelchangeGUsubelHydroEnum,this->lid,&GUsub elHydro,&size);7049 this->inputs->GetArrayPtr(SealevelchangeGUsubelOceanEnum,this->lid,&GUsub elOcean,&size);7002 this->inputs->GetArrayPtr(SealevelchangeGUsubelIceEnum,this->lid,&GUsub[SLGEOM_ICE],&size); 7003 this->inputs->GetArrayPtr(SealevelchangeGUsubelHydroEnum,this->lid,&GUsub[SLGEOM_WATER],&size); 7004 this->inputs->GetArrayPtr(SealevelchangeGUsubelOceanEnum,this->lid,&GUsub[SLGEOM_OCEAN],&size); 7050 7005 if(horiz){ 7006 this->inputs->GetArrayPtr(SealevelchangeGNEnum,this->lid,&GN,&size); 7007 this->inputs->GetArrayPtr(SealevelchangeGNsubelIceEnum,this->lid,&GNsub[SLGEOM_ICE],&size); 7008 this->inputs->GetArrayPtr(SealevelchangeGNsubelHydroEnum,this->lid,&GNsub[SLGEOM_WATER],&size); 7009 this->inputs->GetArrayPtr(SealevelchangeGNsubelOceanEnum,this->lid,&GNsub[SLGEOM_OCEAN],&size); 7010 7051 7011 this->inputs->GetArrayPtr(SealevelchangeGEEnum,this->lid,&GE,&size); 7052 this->inputs->GetArrayPtr(SealevelchangeGEsubelIceEnum,this->lid,&GEsubelIce,&size); 7053 this->inputs->GetArrayPtr(SealevelchangeGEsubelOceanEnum,this->lid,&GEsubelOcean,&size); 7054 this->inputs->GetArrayPtr(SealevelchangeGEsubelHydroEnum,this->lid,&GEsubelHydro,&size); 7055 this->inputs->GetArrayPtr(SealevelchangeGNEnum,this->lid,&GN,&size); 7056 this->inputs->GetArrayPtr(SealevelchangeGNsubelIceEnum,this->lid,&GNsubelIce,&size); 7057 this->inputs->GetArrayPtr(SealevelchangeGNsubelHydroEnum,this->lid,&GNsubelHydro,&size); 7058 this->inputs->GetArrayPtr(SealevelchangeGNsubelOceanEnum,this->lid,&GNsubelOcean,&size); 7059 } 7060 } 7061 7062 for(int i=0;i<NUMVERTICES;i++) { 7063 for (int e=0;e<nel;e++){ 7064 SealevelRSL[i]+=G[i*nel+e]*(sealevelloads[e]+loads[e]); 7065 } 7066 nbar=slgeom->nbar[SLGEOM_ICE]; 7067 for (int e=0;e<nbar;e++){ 7068 SealevelRSL[i]+=GsubelIce[i*nbar+e]*(subelementiceloads[e]); 7069 } 7070 nbar=slgeom->nbar[SLGEOM_WATER]; 7071 for (int e=0;e<nbar;e++){ 7072 SealevelRSL[i]+=GsubelHydro[i*nbar+e]*(subelementhydroloads[e]); 7073 } 7074 nbar=slgeom->nbar[SLGEOM_OCEAN]; 7075 for (int e=0;e<nbar;e++){ 7076 SealevelRSL[i]+=GsubelOcean[i*nbar+e]*(subelementbploads[e]+subelementsealevelloads[e]); 7077 } 7078 7079 if(elastic){ 7080 for (int e=0;e<nel;e++){ 7081 SealevelU[i]+=GU[i*nel+e]*(sealevelloads[e]+loads[e]); 7082 } 7083 nbar=slgeom->nbar[SLGEOM_ICE]; 7084 for (int e=0;e<nbar;e++){ 7085 SealevelU[i]+=GUsubelIce[i*nbar+e]*(subelementiceloads[e]); 7086 } 7087 nbar=slgeom->nbar[SLGEOM_WATER]; 7088 for (int e=0;e<nbar;e++){ 7089 SealevelU[i]+=GUsubelHydro[i*nbar+e]*(subelementhydroloads[e]); 7090 } 7091 nbar=slgeom->nbar[SLGEOM_OCEAN]; 7092 for (int e=0;e<nbar;e++){ 7093 SealevelU[i]+=GUsubelOcean[i*nbar+e]*(subelementbploads[e]+subelementsealevelloads[e]); 7094 } 7095 } 7096 if(horiz && elastic){ 7097 for (int e=0;e<nel;e++){ 7098 SealevelN[i]+=GN[i*nel+e]*(sealevelloads[e]+loads[e]); 7099 SealevelE[i]+=GE[i*nel+e]*(sealevelloads[e]+loads[e]); 7100 } 7101 nbar=slgeom->nbar[SLGEOM_ICE]; 7102 for (int e=0;e<nbar;e++){ 7103 SealevelN[i]+=GNsubelIce[i*nbar+e]*(subelementiceloads[e]); 7104 SealevelE[i]+=GEsubelIce[i*nbar+e]*(subelementiceloads[e]); 7105 } 7106 nbar=slgeom->nbar[SLGEOM_WATER]; 7107 for (int e=0;e<nbar;e++){ 7108 SealevelN[i]+=GNsubelHydro[i*nbar+e]*(subelementhydroloads[e]); 7109 SealevelE[i]+=GEsubelHydro[i*nbar+e]*(subelementhydroloads[e]); 7110 } 7111 nbar=slgeom->nbar[SLGEOM_OCEAN]; 7112 for (int e=0;e<nbar;e++){ 7113 SealevelN[i]+=GNsubelOcean[i*nbar+e]*(subelementbploads[e]+subelementsealevelloads[e]); 7114 SealevelE[i]+=GEsubelOcean[i*nbar+e]*(subelementbploads[e]+subelementsealevelloads[e]); 7115 } 7012 this->inputs->GetArrayPtr(SealevelchangeGEsubelIceEnum,this->lid,&GEsub[SLGEOM_ICE],&size); 7013 this->inputs->GetArrayPtr(SealevelchangeGEsubelHydroEnum,this->lid,&GEsub[SLGEOM_WATER],&size); 7014 this->inputs->GetArrayPtr(SealevelchangeGEsubelOceanEnum,this->lid,&GEsub[SLGEOM_OCEAN],&size); 7015 } 7016 } 7017 7018 this->SealevelchangeGxL(&SealevelRSL[0],G, Gsub, loads, slgeom, nel); 7019 7020 if(elastic){ 7021 this->SealevelchangeGxL(&SealevelU[0],GU, GUsub, loads, slgeom, nel); 7022 if(horiz ){ 7023 this->SealevelchangeGxL(&SealevelN[0],GN, GNsub, loads, slgeom, nel); 7024 this->SealevelchangeGxL(&SealevelE[0],GE, GEsub, loads, slgeom, nel); 7116 7025 } 7117 7026 } … … 7131 7040 7132 7041 } /*}}}*/ 7133 void Tria::SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, IssmDouble* loads, IssmDouble* sealevelloads, SealevelGeometry* slgeom){/*{{{*/ 7042 void Tria::SealevelchangeGxL(IssmDouble* sealevel, IssmDouble* G, IssmDouble** Gsub, GrdLoads* loads, SealevelGeometry* slgeom, int nel) { /*{{{*/ 7043 7044 if(loads->sealevelloads){ 7045 for(int i=0;i<NUMVERTICES;i++) { 7046 for (int e=0;e<nel;e++){ 7047 sealevel[i]+=G[i*nel+e]*(loads->sealevelloads[e]+loads->loads[e]); 7048 } 7049 for(int l=0;l<SLGEOM_NUMLOADS;l++){ 7050 int nbar=slgeom->nbar[l]; 7051 for (int e=0;e<nbar;e++){ 7052 sealevel[i]+=Gsub[l][i*nbar+e]*(loads->subloads[l][e]); 7053 } 7054 if(l==SLGEOM_OCEAN){ 7055 for (int e=0;e<nbar;e++){ 7056 sealevel[i]+=Gsub[l][i*nbar+e]*(loads->subsealevelloads[e]); 7057 } 7058 } 7059 } 7060 } 7061 } 7062 else{ //this is the initial convolution where only loads are provided 7063 for(int i=0;i<NUMVERTICES;i++) { 7064 for (int e=0;e<nel;e++){ 7065 sealevel[i]+=G[i*nel+e]*(loads->loads[e]); 7066 } 7067 for(int l=0;l<SLGEOM_NUMLOADS;l++){ 7068 int nbar=slgeom->nbar[l]; 7069 for (int e=0;e<nbar;e++){ 7070 sealevel[i]+=Gsub[l][i*nbar+e]*(loads->subloads[l][e]); 7071 } 7072 } 7073 } 7074 } 7075 7076 } /*}}}*/ 7077 void Tria::SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom){/*{{{*/ 7134 7078 7135 7079 IssmDouble S=0; … … 7148 7092 7149 7093 /*recover total load: */ 7150 if(loads ) S+=loads[this->Sid()];7151 if( sealevelloads) S+=sealevelloads[this->Sid()];7094 if(loads->loads) S+=loads->loads[this->Sid()]; 7095 if(loads->sealevelloads) S+=loads->sealevelloads[this->Sid()]; 7152 7096 7153 7097 /* Perturbation terms for moment of inertia (moi_list): … … 7161 7105 return; 7162 7106 }/*}}}*/ 7163 void Tria::SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* subelementsealevelloads,SealevelGeometry* slgeom){/*{{{*/7107 void Tria::SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* grdloads, SealevelGeometry* slgeom){/*{{{*/ 7164 7108 7165 7109 IssmDouble SA=0; … … 7181 7125 for(int i=0;i<SLGEOM_NUMLOADS;i++){ 7182 7126 if(slgeom->issubelement[i][this->lid]){ 7183 switch(i){ 7184 case SLGEOM_ICE: 7185 loads=subelementiceloads; 7186 break; 7187 case SLGEOM_WATER: 7188 loads=subelementhydroloads; 7189 break; 7190 case SLGEOM_OCEAN: 7191 loads=subelementbploads; 7192 sealevelloads=subelementsealevelloads; 7193 break; 7194 } 7127 loads=grdloads->subloads[i]; 7128 if(i==SLGEOM_OCEAN) sealevelloads=grdloads->subsealevelloads; 7195 7129 intj=slgeom->subelementmapping[i][this->lid]; 7196 7130 late=slgeom->latbarycentre[i][intj]/180*M_PI; … … 7215 7149 return; 7216 7150 }/*}}}*/ 7217 void Tria::SealevelchangeShift( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementloads,IssmDouble offset, SealevelGeometry* slgeom){ /*{{{*/7151 void Tria::SealevelchangeShift(GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom){ /*{{{*/ 7218 7152 7219 7153 if(slgeom->isoceanin[this->lid]){ 7220 7154 if(slgeom->issubelement[SLGEOM_OCEAN][this->lid]){ 7221 7155 int intj=slgeom->subelementmapping[SLGEOM_OCEAN][this->lid]; 7222 subelementloads->SetValue(intj,offset,ADD_VAL);7223 } 7224 else loads-> SetValue(this->sid,offset,ADD_VAL);7156 loads->vsubsealevelloads->SetValue(intj,offset,ADD_VAL); 7157 } 7158 else loads->vsealevelloads->SetValue(this->sid,offset,ADD_VAL); 7225 7159 } 7226 7160 -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r26222 r26227 173 173 void SealevelchangeGeometrySubElementLoads(SealevelGeometry* slgeom, IssmDouble* areae); 174 174 void SealevelchangeGeometryCentroidLoads(SealevelGeometry* slgeom, IssmDouble* xxe, IssmDouble* yye, IssmDouble* zze, IssmDouble* areae); 175 void SealevelchangeBarystaticLoads( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementiceloads, Vector<IssmDouble>* subelementhydroloads, Vector<IssmDouble>* subelementbploads, BarystaticContributions* barycontrib, SealevelGeometry* slgeom);176 void SealevelchangeConvolution( Vector<IssmDouble>* sealevelloads, Vector<IssmDouble>* subelementsealevelloads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* allsealevelloads, IssmDouble* allloads,IssmDouble* allsubelementiceloads, IssmDouble* allsubelementhydroloads, IssmDouble* allsubelementbploads, IssmDouble* allsubelementsealevelloads, IssmDouble* rotationvector,SealevelGeometry* slgeom);177 void SealevelchangeDeformationConvolution( IssmDouble* sealevelloads, IssmDouble* subelementsealevelloads, IssmDouble* loads, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* rotationvector,SealevelGeometry* slgeom);178 void SealevelchangeShift( Vector<IssmDouble>* loads, Vector<IssmDouble>* subelementloads,IssmDouble offset, SealevelGeometry* slgeom);179 void SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, IssmDouble* loads, IssmDouble* sealevelloads,SealevelGeometry* slgeom);180 void SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* subelementsealevelloads, SealevelGeometry* slgeom);175 void SealevelchangeBarystaticLoads(GrdLoads* loads, BarystaticContributions* barycontrib, SealevelGeometry* slgeom); 176 void SealevelchangeConvolution(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble* rotationvector,SealevelGeometry* slgeom); 177 void SealevelchangeDeformationConvolution(GrdLoads* loads, IssmDouble* rotationvector,SealevelGeometry* slgeom); 178 void SealevelchangeShift(GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom); 179 void SealevelchangeMomentOfInertiaCentroid(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom); 180 void SealevelchangeMomentOfInertiaSubElement(IssmDouble* dI_list, GrdLoads* loads, SealevelGeometry* slgeom); 181 181 #endif 182 182 /*}}}*/ … … 214 214 Gauss* NewGauss(void); 215 215 Gauss* NewGauss(int order); 216 Gauss* NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order);217 Gauss* NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order);218 Gauss* NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,int order);219 Gauss* NewGauss(IssmDouble fraction1,IssmDouble fraction2,int order);220 Gauss* NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert);216 Gauss* NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order); 217 Gauss* NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order); 218 Gauss* NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,int order); 219 Gauss* NewGauss(IssmDouble fraction1,IssmDouble fraction2,int order); 220 Gauss* NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert); 221 221 Gauss* NewGaussBase(int order); 222 222 Gauss* NewGaussLine(int vertex1,int vertex2,int order){_error_("not implemented yet");}; … … 237 237 void SetTemporaryElementType(int element_type_in){_error_("not implemented yet");}; 238 238 void InputServe(Input* input_in); 239 Seg* 239 Seg* SpawnSeg(int index1,int index2); 240 240 IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){_error_("not implemented yet");}; 241 241 void StabilizationParameterAnisotropic(IssmDouble* tau_parameter_ansiotropic, IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble hx, IssmDouble hy, IssmDouble hz, IssmDouble kappa){_error_("not implemented yet");}; 242 242 void UpdateConstraintsExtrudeFromBase(void); 243 243 void UpdateConstraintsExtrudeFromTop(void); 244 void SealevelchangeGxL(IssmDouble* sealevel, IssmDouble* G, IssmDouble** Gsub, GrdLoads* loads, SealevelGeometry* slgeom, int nel); 244 245 /*}}}*/ 245 246 -
issm/trunk-jpl/src/c/classes/classes.h
r26222 r26227 19 19 #include "./Misfit.h" 20 20 #include "./SealevelGeometry.h" 21 #include "./GrdLoads.h" 21 22 #include "./BarystaticContributions.h" 22 23 #include "./Nodalvalue.h" -
issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp
r26222 r26227 23 23 void TransferForcing(FemModel* femmodel,int forcingenum); 24 24 void TransferSealevel(FemModel* femmodel,int forcingenum); 25 void slcconvergence(bool* pconverged,Vector<IssmDouble>* RSLg,Vector<IssmDouble>* RSLg_old,IssmDouble eps_rel,IssmDouble eps_abs);26 IssmDouble SealevelloadsOceanAverage(Vector<IssmDouble>* sealevelloads,Vector<IssmDouble>* subelementsealevelloads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble oceanarea);27 void RotationAxisMotion(IssmDouble* m, FemModel* femmodel, IssmDouble* loads, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* sealevelloads, IssmDouble* subelementsealevelloads, SealevelGeometry* slgeom);28 void ConserveOceanMass(FemModel* femmodel, Vector<IssmDouble>* sealevelloads, Vector<IssmDouble>* subelementsealevelloads, IssmDouble offset, SealevelGeometry* slgeom);25 bool slcconvergence(Vector<IssmDouble>* RSLg,Vector<IssmDouble>* RSLg_old,IssmDouble eps_rel,IssmDouble eps_abs); 26 IssmDouble SealevelloadsOceanAverage(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble oceanarea); 27 void RotationAxisMotion(IssmDouble* m, FemModel* femmodel,GrdLoads* loads, SealevelGeometry* slgeom); 28 void ConserveOceanMass(FemModel* femmodel,GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom); 29 29 void ivins_deformation_core(FemModel* femmodel); 30 30 IssmDouble* CombineLoads(IssmDouble* load,IssmDouble* subload,FemModel* femmodel, SealevelGeometry* slgeom,int loadtype,int nel); … … 32 32 33 33 /*main cores:*/ 34 void sealevelchange_core(FemModel* femmodel){ /*{{{*/34 void sealevelchange_core(FemModel* femmodel){ /*{{{*/ 35 35 36 36 SealevelGeometry* slgeom=NULL; … … 83 83 } 84 84 /*}}}*/ 85 void solidearthexternal_core(FemModel* femmodel){ /*{{{*/85 void solidearthexternal_core(FemModel* femmodel){ /*{{{*/ 86 86 87 87 /*variables:*/ … … 152 152 } 153 153 /*}}}*/ 154 void couplerinput_core(FemModel* femmodel){ /*{{{*/154 void couplerinput_core(FemModel* femmodel){ /*{{{*/ 155 155 156 156 /*Be very careful here, everything is well thought through, do not remove … … 215 215 216 216 }; /*}}}*/ 217 void grd_core(FemModel* femmodel, SealevelGeometry* slgeom) { /*{{{*/217 void grd_core(FemModel* femmodel, SealevelGeometry* slgeom) { /*{{{*/ 218 218 219 219 /*variables:{{{*/ … … 223 223 IssmDouble rotationaxismotionvector[3]={0}; 224 224 225 Vector<IssmDouble>* loads=NULL; 226 IssmDouble* allloads=NULL; 227 Vector<IssmDouble>* subelementiceloads=NULL; 228 IssmDouble* allsubelementiceloads=NULL; 229 Vector<IssmDouble>* subelementhydroloads=NULL; 230 IssmDouble* allsubelementhydroloads=NULL; 231 Vector<IssmDouble>* subelementbploads=NULL; 232 IssmDouble* allsubelementbploads=NULL; 233 Vector<IssmDouble>* sealevelloads=NULL; 234 IssmDouble* allsealevelloads=NULL; 235 Vector<IssmDouble>* subelementsealevelloads=NULL; 236 IssmDouble* allsubelementsealevelloads=NULL; 225 GrdLoads* loads=NULL; 237 226 Vector<IssmDouble>* oldsealevelloads=NULL; 238 227 Vector<IssmDouble>* oceanareas=NULL; … … 249 238 int step; 250 239 IssmDouble time; 251 bool converged=false;252 240 253 241 int modelid,earthid; … … 301 289 femmodel->parameters->FindParam(&nel,MeshNumberofelementsEnum); 302 290 303 loads=new Vector<IssmDouble>(nel); 304 subelementiceloads=new Vector<IssmDouble>(slgeom->nbar[SLGEOM_ICE]); 305 subelementhydroloads=new Vector<IssmDouble>(slgeom->nbar[SLGEOM_WATER]); 306 subelementbploads=new Vector<IssmDouble>(slgeom->nbar[SLGEOM_OCEAN]); 307 308 sealevelloads=new Vector<IssmDouble>(nel); 309 sealevelloads->Set(0);sealevelloads->Assemble(); 310 subelementsealevelloads=new Vector<IssmDouble>(slgeom->nbar[SLGEOM_OCEAN]); 291 loads=new GrdLoads(nel,slgeom); 311 292 subelementoceanareas=new Vector<IssmDouble>(slgeom->nbar[SLGEOM_OCEAN]); 312 293 oceanareas=new Vector<IssmDouble>(nel); … … 317 298 for(Object* & object : femmodel->elements->objects){ 318 299 Element* element = xDynamicCast<Element*>(object); 319 element->SealevelchangeBarystaticLoads(loads, subelementiceloads, subelementhydroloads, subelementbploads, barycontrib,slgeom); 320 } 321 loads->Assemble(); 322 subelementiceloads->Assemble(); 323 subelementhydroloads->Assemble(); 324 subelementbploads->Assemble(); 325 300 element->SealevelchangeBarystaticLoads(loads, barycontrib,slgeom); 301 } 326 302 327 303 //broadcast loads 328 allloads=loads->ToMPISerial(); 329 allsubelementiceloads=subelementiceloads->ToMPISerial(); 330 allsubelementhydroloads=subelementhydroloads->ToMPISerial(); 331 allsubelementbploads=subelementbploads->ToMPISerial(); 304 loads->BroadcastLoads(); 332 305 333 306 //compute rotation axis motion: 334 RotationAxisMotion(&rotationaxismotionvector[0],femmodel, allloads,allsubelementiceloads,allsubelementhydroloads,allsubelementbploads, NULL, NULL,slgeom);307 RotationAxisMotion(&rotationaxismotionvector[0],femmodel,loads,slgeom); 335 308 336 309 /*skip computation of sea level if requested, which means sea level loads should be zeroed */ 337 310 if(!computesealevel){ 338 allsealevelloads=xNewZeroInit<IssmDouble>(nel);339 allsubelementsealevelloads=xNewZeroInit<IssmDouble>(slgeom->nbar[SLGEOM_OCEAN]);311 loads->sealevelloads=xNewZeroInit<IssmDouble>(nel); 312 loads->subsealevelloads=xNewZeroInit<IssmDouble>(slgeom->nbar[SLGEOM_OCEAN]); 340 313 goto deformation; 341 314 } … … 344 317 for(;;){ 345 318 346 oldsealevelloads= sealevelloads->Duplicate();sealevelloads->Copy(oldsealevelloads);319 oldsealevelloads=loads->vsealevelloads->Duplicate(); loads->vsealevelloads->Copy(oldsealevelloads); 347 320 348 321 /*convolve load and sealevel loads on oceans:*/ 349 322 for(Object* & object : femmodel->elements->objects){ 350 323 Element* element = xDynamicCast<Element*>(object); 351 element->SealevelchangeConvolution(sealevelloads, subelementsealevelloads, oceanareas, subelementoceanareas, allsealevelloads, allloads,allsubelementiceloads, allsubelementhydroloads, allsubelementbploads, allsubelementsealevelloads, rotationaxismotionvector,slgeom); 352 } 353 354 sealevelloads->Assemble(); 355 subelementsealevelloads->Assemble(); 356 324 element->SealevelchangeConvolution(loads, oceanareas, subelementoceanareas, rotationaxismotionvector,slgeom); 325 } 326 327 loads->AssembleSealevelLoads(); 328 357 329 /*compute ocean areas:*/ 358 if(! allsealevelloads){ //first time in the loop330 if(!loads->sealevelloads){ //first time in the loop 359 331 oceanareas->Assemble(); 360 332 subelementoceanareas->Assemble(); … … 364 336 365 337 //Conserve ocean mass: 366 oceanaverage=SealevelloadsOceanAverage(sealevelloads,subelementsealevelloads, oceanareas,subelementoceanareas, oceanarea); 367 368 ConserveOceanMass(femmodel,sealevelloads,subelementsealevelloads,barycontrib->Total()/oceanarea - oceanaverage,slgeom); 338 oceanaverage=SealevelloadsOceanAverage(loads, oceanareas,subelementoceanareas, oceanarea); 339 ConserveOceanMass(femmodel,loads,barycontrib->Total()/oceanarea - oceanaverage,slgeom); 369 340 370 341 //broadcast sea level loads 371 allsealevelloads=sealevelloads->ToMPISerial(); 372 allsubelementsealevelloads=subelementsealevelloads->ToMPISerial(); 342 loads->BroadcastSealevelLoads(); 373 343 374 344 //compute rotation axis motion: 375 RotationAxisMotion(&rotationaxismotionvector[0],femmodel, allloads,allsubelementiceloads,allsubelementhydroloads,allsubelementbploads, allsealevelloads,allsubelementsealevelloads,slgeom);345 RotationAxisMotion(&rotationaxismotionvector[0],femmodel,loads, slgeom); 376 346 377 347 //convergence? 378 slcconvergence(&converged,sealevelloads,oldsealevelloads,eps_rel,eps_abs); 379 if (converged)break; 348 if(slcconvergence(loads->vsealevelloads,oldsealevelloads,eps_rel,eps_abs))break; 380 349 381 350 //early return? 382 351 if(iterations>=max_nonlinear_iterations)break; 383 elseiterations++;352 iterations++; 384 353 } 385 354 … … 391 360 for(Object* & object : femmodel->elements->objects){ 392 361 Element* element = xDynamicCast<Element*>(object); 393 element->SealevelchangeDeformationConvolution( allsealevelloads, allsubelementsealevelloads,allloads, allsubelementiceloads, allsubelementhydroloads, allsubelementbploads,rotationaxismotionvector,slgeom);362 element->SealevelchangeDeformationConvolution(loads, rotationaxismotionvector,slgeom); 394 363 } 395 364 … … 414 383 } 415 384 /*}}}*/ 416 void dynstr_core(FemModel* femmodel){ /*{{{*/385 void dynstr_core(FemModel* femmodel){ /*{{{*/ 417 386 418 387 /*variables:*/ … … 480 449 } 481 450 /*}}}*/ 482 void coupleroutput_core(FemModel* femmodel){ /*{{{*/451 void coupleroutput_core(FemModel* femmodel){ /*{{{*/ 483 452 484 453 /*parameters:*/ … … 500 469 } 501 470 }; /*}}}*/ 502 void ivins_deformation_core(FemModel* femmodel){ /*{{{*/471 void ivins_deformation_core(FemModel* femmodel){ /*{{{*/ 503 472 504 473 int gsize; … … 551 520 } 552 521 /*}}}*/ 553 554 //Geometry: 555 void sealevelchange_initialgeometry(FemModel* femmodel) { /*{{{*/ 522 void sealevelchange_initialgeometry(FemModel* femmodel) { /*{{{*/ 556 523 557 524 /*Geometry core where we compute geometrical kernels and weights:*/ … … 668 635 }/*}}}*/ 669 636 670 /*Support routines:*/ 637 /*subroutines:*/ 638 bool slcconvergence(Vector<IssmDouble>* RSLg,Vector<IssmDouble>* RSLg_old,IssmDouble eps_rel,IssmDouble eps_abs){ /*{{{*/ 639 640 bool converged=true; 641 IssmDouble ndS,nS; 642 Vector<IssmDouble> *dRSLg = NULL; 643 644 //compute norm(du) and norm(u) if requested 645 dRSLg=RSLg_old->Duplicate(); RSLg_old->Copy(dRSLg); dRSLg->AYPX(RSLg,-1.0); 646 ndS=dRSLg->Norm(NORM_TWO); 647 648 if (xIsNan<IssmDouble>(ndS)){ 649 _error_("convergence criterion is NaN (RSL_old=" << RSLg_old->Norm(NORM_TWO) << " RSL=" << RSLg->Norm(NORM_TWO) << ")"); 650 } 651 652 if(!xIsNan<IssmDouble>(eps_rel)){ 653 nS=RSLg_old->Norm(NORM_TWO); 654 if (xIsNan<IssmDouble>(nS)) _error_("convergence criterion is NaN! (check the initial RSL)"); 655 } 656 657 //clean up 658 delete dRSLg; 659 660 //print 661 if(!xIsNan<IssmDouble>(eps_rel)){ 662 if((ndS/nS)<eps_rel){ 663 if(VerboseConvergence()) _printf0_(setw(50) << left << " convergence criterion: norm(dS)/norm(S)" << ndS/nS*100 << " < " << eps_rel*100 << " %\n"); 664 } 665 else{ 666 if(VerboseConvergence()) _printf0_(setw(50) << left << " convergence criterion: norm(dS)/norm(S)" << ndS/nS*100 << " > " << eps_rel*100 << " %\n"); 667 converged=false; 668 } 669 } 670 if(!xIsNan<IssmDouble>(eps_abs)){ 671 if(ndS<eps_abs){ 672 if(VerboseConvergence()) _printf0_(setw(50) << left << " convergence criterion: norm(dS)" << ndS << " < " << eps_abs << " \n"); 673 } 674 else{ 675 if(VerboseConvergence()) _printf0_(setw(50) << left << " convergence criterion: norm(dS)" << ndS << " > " << eps_abs << " \n"); 676 converged=false; 677 } 678 } 679 680 /*assign output*/ 681 return converged; 682 683 } /*}}}*/ 684 IssmDouble SealevelloadsOceanAverage(GrdLoads* loads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* suboceanareas, IssmDouble oceanarea){ /*{{{*/ 685 686 IssmDouble sealevelloadsaverage; 687 IssmDouble subsealevelloadsaverage; 688 689 Vector<IssmDouble>* vsealevelloadsvolume=loads->vsealevelloads->Duplicate(); 690 Vector<IssmDouble>* vsubsealevelloadsvolume=loads->vsubsealevelloads->Duplicate(); 691 692 vsealevelloadsvolume->PointwiseMult(loads->vsealevelloads,oceanareas); 693 vsubsealevelloadsvolume->PointwiseMult(loads->vsubsealevelloads,suboceanareas); 694 695 vsealevelloadsvolume->Sum(&sealevelloadsaverage); 696 vsubsealevelloadsvolume->Sum(&subsealevelloadsaverage); 697 delete vsealevelloadsvolume; 698 delete vsubsealevelloadsvolume; 699 700 //return (sealevelloadsaverage+subsealevelloadsaverage)/oceanarea; 701 return (sealevelloadsaverage)/oceanarea; 702 } /*}}}*/ 703 void RotationAxisMotion(IssmDouble* m, FemModel* femmodel,GrdLoads* loads, SealevelGeometry* slgeom){ /*{{{*/ 704 705 IssmDouble moi_list[3]={0,0,0}; 706 IssmDouble moi_list_sub[3]={0,0,0}; 707 IssmDouble moi_list_cpu[3]={0,0,0}; 708 IssmDouble* tide_love_h = NULL; 709 IssmDouble* tide_love_k = NULL; 710 IssmDouble* load_love_k = NULL; 711 IssmDouble tide_love_k2secular; 712 IssmDouble moi_e, moi_p; 713 IssmDouble m1, m2, m3; 714 bool rotation=false; 715 716 /*early return?:*/ 717 femmodel->parameters->FindParam(&rotation,SolidearthSettingsRotationEnum); 718 if(!rotation)return; 719 720 /*retrieve parameters: */ 721 femmodel->parameters->FindParam(&load_love_k,NULL,NULL,LoadLoveKEnum); 722 femmodel->parameters->FindParam(&tide_love_h,NULL,NULL,TidalLoveHEnum); 723 femmodel->parameters->FindParam(&tide_love_k,NULL,NULL,TidalLoveKEnum); 724 femmodel->parameters->FindParam(&tide_love_k2secular,TidalLoveK2SecularEnum); 725 femmodel->parameters->FindParam(&moi_e,RotationalEquatorialMoiEnum); 726 femmodel->parameters->FindParam(&moi_p,RotationalPolarMoiEnum); 727 728 for(Object* & object : femmodel->elements->objects){ 729 Element* element = xDynamicCast<Element*>(object); 730 731 element->SealevelchangeMomentOfInertiaCentroid(&moi_list[0],loads,slgeom); 732 733 element->SealevelchangeMomentOfInertiaSubElement(&moi_list_sub[0],loads, slgeom); 734 735 moi_list_cpu[0] += moi_list[0]+moi_list_sub[0]; 736 moi_list_cpu[1] += moi_list[1]+moi_list_sub[1]; 737 moi_list_cpu[2] += moi_list[2]+moi_list_sub[2]; 738 } 739 740 741 ISSM_MPI_Reduce (&moi_list_cpu[0],&moi_list[0],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); 742 ISSM_MPI_Bcast(&moi_list[0],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 743 744 ISSM_MPI_Reduce (&moi_list_cpu[1],&moi_list[1],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); 745 ISSM_MPI_Bcast(&moi_list[1],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 746 747 ISSM_MPI_Reduce (&moi_list_cpu[2],&moi_list[2],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); 748 ISSM_MPI_Bcast(&moi_list[2],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 749 750 /*compute perturbation terms for angular velocity vector: */ 751 m1 = 1/(1-tide_love_k[2]/tide_love_k2secular) * (1+load_love_k[2])/(moi_p-moi_e) * moi_list[0]; 752 m2 = 1/(1-tide_love_k[2]/tide_love_k2secular) * (1+load_love_k[2])/(moi_p-moi_e) * moi_list[1]; 753 m3 = -(1+load_love_k[2])/moi_p * moi_list[2]; // term associated with fluid number (3-order-of-magnitude smaller) is negelected 754 755 /*Assign output pointers:*/ 756 m[0]=m1; 757 m[1]=m2; 758 m[2]=m3; 759 } /*}}}*/ 760 void ConserveOceanMass(FemModel* femmodel,GrdLoads* loads, IssmDouble offset, SealevelGeometry* slgeom){ /*{{{*/ 761 762 /*Shift sealevel loads by ocean average, only on ocean! :*/ 763 for(Object* & object : femmodel->elements->objects){ 764 Element* element = xDynamicCast<Element*>(object); 765 element->SealevelchangeShift(loads, offset,slgeom); 766 } 767 loads->AssembleSealevelLoads(); 768 769 } /*}}}*/ 770 IssmDouble* CombineLoads(IssmDouble* load,IssmDouble* subload,FemModel* femmodel, SealevelGeometry* slgeom,int loadtype,int nel){ /*{{{*/ 771 772 int* indices=xNew<int>(nel); 773 for(int i=0;i<nel;i++)indices[i]=i; 774 775 Vector<IssmDouble>* vloadcopy=new Vector<IssmDouble>(nel); 776 IssmDouble* loadcopy=xNew<IssmDouble>(nel); 777 778 vloadcopy->SetValues(nel,indices,load,INS_VAL); 779 vloadcopy->Assemble(); 780 781 782 if(subload){ 783 for (int i=0;i<femmodel->elements->Size();i++){ 784 if (slgeom->issubelement[loadtype][i]){ 785 int se= slgeom->subelementmapping[loadtype][i]; 786 IssmDouble subloadi=subload[se]; 787 Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i)); 788 vloadcopy->SetValue(element->Sid(),subloadi,ADD_VAL); 789 } 790 } 791 } 792 vloadcopy->Assemble(); 793 loadcopy=vloadcopy->ToMPISerial(); 794 795 return loadcopy; 796 797 } /*}}}*/ 798 799 /*Coupling routines:*/ 671 800 void TransferForcing(FemModel* femmodel,int forcingenum){ /*{{{*/ 672 801 … … 914 1043 915 1044 } /*}}}*/ 916 void slcconvergence(bool* pconverged, Vector<IssmDouble>* RSLg,Vector<IssmDouble>* RSLg_old,IssmDouble eps_rel,IssmDouble eps_abs){ /*{{{*/917 918 bool converged=true;919 IssmDouble ndS,nS;920 Vector<IssmDouble> *dRSLg = NULL;921 922 //compute norm(du) and norm(u) if requested923 dRSLg=RSLg_old->Duplicate(); RSLg_old->Copy(dRSLg); dRSLg->AYPX(RSLg,-1.0);924 ndS=dRSLg->Norm(NORM_TWO);925 926 if (xIsNan<IssmDouble>(ndS)){927 _error_("convergence criterion is NaN (RSL_old=" << RSLg_old->Norm(NORM_TWO) << " RSL=" << RSLg->Norm(NORM_TWO) << ")");928 }929 930 if(!xIsNan<IssmDouble>(eps_rel)){931 nS=RSLg_old->Norm(NORM_TWO);932 if (xIsNan<IssmDouble>(nS)) _error_("convergence criterion is NaN! (check the initial RSL)");933 }934 935 //clean up936 delete dRSLg;937 938 //print939 if(!xIsNan<IssmDouble>(eps_rel)){940 if((ndS/nS)<eps_rel){941 if(VerboseConvergence()) _printf0_(setw(50) << left << " convergence criterion: norm(dS)/norm(S)" << ndS/nS*100 << " < " << eps_rel*100 << " %\n");942 }943 else{944 if(VerboseConvergence()) _printf0_(setw(50) << left << " convergence criterion: norm(dS)/norm(S)" << ndS/nS*100 << " > " << eps_rel*100 << " %\n");945 converged=false;946 }947 }948 if(!xIsNan<IssmDouble>(eps_abs)){949 if(ndS<eps_abs){950 if(VerboseConvergence()) _printf0_(setw(50) << left << " convergence criterion: norm(dS)" << ndS << " < " << eps_abs << " \n");951 }952 else{953 if(VerboseConvergence()) _printf0_(setw(50) << left << " convergence criterion: norm(dS)" << ndS << " > " << eps_abs << " \n");954 converged=false;955 }956 }957 958 /*assign output*/959 *pconverged=converged;960 961 } /*}}}*/962 IssmDouble SealevelloadsOceanAverage(Vector<IssmDouble>* sealevelloads,Vector<IssmDouble>* subelementsealevelloads, Vector<IssmDouble>* oceanareas, Vector<IssmDouble>* subelementoceanareas, IssmDouble oceanarea){ /*{{{*/963 964 IssmDouble sealevelloadsaverage;965 IssmDouble subelementsealevelloadsaverage;966 967 Vector<IssmDouble>* sealevelloadsvolume=sealevelloads->Duplicate();968 Vector<IssmDouble>* subelementsealevelloadsvolume=subelementsealevelloads->Duplicate();969 970 sealevelloadsvolume->PointwiseMult(sealevelloads,oceanareas);971 subelementsealevelloadsvolume->PointwiseMult(subelementsealevelloads,subelementoceanareas);972 973 sealevelloadsvolume->Sum(&sealevelloadsaverage);974 subelementsealevelloadsvolume->Sum(&subelementsealevelloadsaverage);975 delete sealevelloadsvolume;976 delete subelementsealevelloadsvolume;977 978 //return (sealevelloadsaverage+subelementsealevelloadsaverage)/oceanarea;979 return (sealevelloadsaverage)/oceanarea;980 } /*}}}*/981 void RotationAxisMotion(IssmDouble* m, FemModel* femmodel,IssmDouble* loads, IssmDouble* subelementiceloads, IssmDouble* subelementhydroloads, IssmDouble* subelementbploads, IssmDouble* sealevelloads, IssmDouble* subelementsealevelloads, SealevelGeometry* slgeom){ /*{{{*/982 983 IssmDouble moi_list[3]={0,0,0};984 IssmDouble moi_list_sub[3]={0,0,0};985 IssmDouble moi_list_cpu[3]={0,0,0};986 IssmDouble* tide_love_h = NULL;987 IssmDouble* tide_love_k = NULL;988 IssmDouble* load_love_k = NULL;989 IssmDouble tide_love_k2secular;990 IssmDouble moi_e, moi_p;991 IssmDouble m1, m2, m3;992 bool rotation=false;993 994 /*early return?:*/995 femmodel->parameters->FindParam(&rotation,SolidearthSettingsRotationEnum);996 if(!rotation)return;997 998 /*retrieve parameters: */999 femmodel->parameters->FindParam(&load_love_k,NULL,NULL,LoadLoveKEnum);1000 femmodel->parameters->FindParam(&tide_love_h,NULL,NULL,TidalLoveHEnum);1001 femmodel->parameters->FindParam(&tide_love_k,NULL,NULL,TidalLoveKEnum);1002 femmodel->parameters->FindParam(&tide_love_k2secular,TidalLoveK2SecularEnum);1003 femmodel->parameters->FindParam(&moi_e,RotationalEquatorialMoiEnum);1004 femmodel->parameters->FindParam(&moi_p,RotationalPolarMoiEnum);1005 1006 for(Object* & object : femmodel->elements->objects){1007 Element* element = xDynamicCast<Element*>(object);1008 1009 element->SealevelchangeMomentOfInertiaCentroid(&moi_list[0],loads,sealevelloads,slgeom);1010 1011 element->SealevelchangeMomentOfInertiaSubElement(&moi_list_sub[0],subelementiceloads, subelementhydroloads, subelementbploads, subelementsealevelloads,slgeom);1012 1013 moi_list_cpu[0] += moi_list[0]+moi_list_sub[0];1014 moi_list_cpu[1] += moi_list[1]+moi_list_sub[1];1015 moi_list_cpu[2] += moi_list[2]+moi_list_sub[2];1016 }1017 1018 1019 ISSM_MPI_Reduce (&moi_list_cpu[0],&moi_list[0],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );1020 ISSM_MPI_Bcast(&moi_list[0],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());1021 1022 ISSM_MPI_Reduce (&moi_list_cpu[1],&moi_list[1],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );1023 ISSM_MPI_Bcast(&moi_list[1],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());1024 1025 ISSM_MPI_Reduce (&moi_list_cpu[2],&moi_list[2],1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );1026 ISSM_MPI_Bcast(&moi_list[2],1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());1027 1028 /*compute perturbation terms for angular velocity vector: */1029 m1 = 1/(1-tide_love_k[2]/tide_love_k2secular) * (1+load_love_k[2])/(moi_p-moi_e) * moi_list[0];1030 m2 = 1/(1-tide_love_k[2]/tide_love_k2secular) * (1+load_love_k[2])/(moi_p-moi_e) * moi_list[1];1031 m3 = -(1+load_love_k[2])/moi_p * moi_list[2]; // term associated with fluid number (3-order-of-magnitude smaller) is negelected1032 1033 /*Assign output pointers:*/1034 m[0]=m1;1035 m[1]=m2;1036 m[2]=m3;1037 } /*}}}*/1038 void ConserveOceanMass(FemModel* femmodel,Vector<IssmDouble>* sealevelloads, Vector<IssmDouble>* subelementsealevelloads, IssmDouble offset, SealevelGeometry* slgeom){ /*{{{*/1039 1040 /*Shift sealevel loads by ocean average, only on ocean! :*/1041 for(Object* & object : femmodel->elements->objects){1042 Element* element = xDynamicCast<Element*>(object);1043 element->SealevelchangeShift(sealevelloads,subelementsealevelloads,offset,slgeom);1044 }1045 sealevelloads->Assemble();1046 subelementsealevelloads->Assemble();1047 1048 } /*}}}*/1049 IssmDouble* CombineLoads(IssmDouble* load,IssmDouble* subload,FemModel* femmodel, SealevelGeometry* slgeom,int loadtype,int nel){ /*{{{*/1050 1051 int* indices=xNew<int>(nel);1052 for(int i=0;i<nel;i++)indices[i]=i;1053 1054 Vector<IssmDouble>* vloadcopy=new Vector<IssmDouble>(nel);1055 IssmDouble* loadcopy=xNew<IssmDouble>(nel);1056 1057 vloadcopy->SetValues(nel,indices,load,INS_VAL);1058 vloadcopy->Assemble();1059 1060 1061 if(subload){1062 for (int i=0;i<femmodel->elements->Size();i++){1063 if (slgeom->issubelement[loadtype][i]){1064 int se= slgeom->subelementmapping[loadtype][i];1065 IssmDouble subloadi=subload[se];1066 Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));1067 vloadcopy->SetValue(element->Sid(),subloadi,ADD_VAL);1068 }1069 }1070 }1071 vloadcopy->Assemble();1072 loadcopy=vloadcopy->ToMPISerial();1073 1074 return loadcopy;1075 1076 } /*}}}*/1077
Note:
See TracChangeset
for help on using the changeset viewer.