Changeset 24938
- Timestamp:
- 05/31/20 00:21:13 (5 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 1 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.h
r24935 r24938 30 30 class DatasetInput2; 31 31 class IoModel; 32 class SealevelMasks; 32 33 class Gauss; 33 34 class ElementVector; … … 373 374 #endif 374 375 #ifdef _HAVE_SEALEVELRISE_ 376 virtual void SetSealevelMasks(SealevelMasks* masks)=0; 375 377 virtual IssmDouble GetArea3D(void)=0; 376 378 virtual IssmDouble GetAreaSpherical(void)=0; 377 virtual IssmDouble OceanAverage(IssmDouble* Sg)=0; 378 virtual IssmDouble OceanArea(void)=0; 379 virtual void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea)=0; 380 virtual void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea)=0; 379 virtual IssmDouble OceanAverage(IssmDouble* Sg, SealevelMasks* masks)=0; 380 virtual void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, SealevelMasks* masks,IssmDouble eartharea)=0; 381 virtual void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea)=0; 381 382 virtual void SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius)=0; 382 virtual void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea)=0;383 virtual void SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz)=0;383 virtual void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old,SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea)=0; 384 virtual void SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg,SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz)=0; 384 385 #endif 385 386 -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r24924 r24938 212 212 #endif 213 213 #ifdef _HAVE_SEALEVELRISE_ 214 IssmDouble OceanA rea(void){_error_("not implemented yet!");};215 IssmDouble OceanAverage(IssmDouble* Sg){_error_("not implemented yet!");};216 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, IssmDouble eartharea){_error_("not implemented yet!");};214 IssmDouble OceanAverage(IssmDouble* Sg, SealevelMasks* masks){_error_("not implemented yet!");}; 215 void SetSealevelMasks(SealevelMasks* masks){_error_("not implemented yet!");}; 216 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, SealevelMasks* masks,IssmDouble eartharea){_error_("not implemented yet!");}; 217 217 void SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius){_error_("not implemented yet!");}; 218 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");};219 void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");};220 void SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){_error_("not implemented yet!");};218 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 219 void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old, SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; 220 void SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg, SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){_error_("not implemented yet!");}; 221 221 #endif 222 222 -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r24924 r24938 172 172 #endif 173 173 #ifdef _HAVE_SEALEVELRISE_ 174 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea){_error_("not implemented yet!");}; 174 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, SealevelMasks* masks,IssmDouble eartharea){_error_("not implemented yet!");}; 175 void SetSealevelMasks(SealevelMasks* masks){_error_("not implemented yet!");}; 175 176 void SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius){_error_("not implemented yet!");}; 176 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 177 void SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; 178 void SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){_error_("not implemented yet!");}; 179 IssmDouble OceanArea(void){_error_("not implemented yet!");}; 180 IssmDouble OceanAverage(IssmDouble* Sg){_error_("not implemented yet!");}; 177 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 178 void SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old, SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; 179 void SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg, SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){_error_("not implemented yet!");}; 180 IssmDouble OceanAverage(IssmDouble* Sg, SealevelMasks* masks){_error_("not implemented yet!");}; 181 181 #endif 182 182 -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r24924 r24938 178 178 #endif 179 179 #ifdef _HAVE_SEALEVELRISE_ 180 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea){_error_("not implemented yet!");}; 180 void SetSealevelMasks(SealevelMasks* masks){_error_("not implemented yet!");}; 181 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, SealevelMasks* masks,IssmDouble eartharea){_error_("not implemented yet!");}; 181 182 void SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius){_error_("not implemented yet!");}; 182 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 183 void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; 184 void SealevelriseGeodetic(IssmDouble* Up ,IssmDouble* North, IssmDouble* East, IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){_error_("not implemented yet!");}; 185 IssmDouble OceanArea(void){_error_("not implemented yet!");}; 186 IssmDouble OceanAverage(IssmDouble* Sg){_error_("not implemented yet!");}; 183 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 184 void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old, SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; 185 void SealevelriseGeodetic(IssmDouble* Up ,IssmDouble* North, IssmDouble* East, IssmDouble* Sg, SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){_error_("not implemented yet!");}; 186 IssmDouble OceanAverage(IssmDouble* Sg, SealevelMasks* masks){_error_("not implemented yet!");}; 187 187 #endif 188 188 -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r24935 r24938 3016 3016 3017 3017 if(!IsIceInElement())return 0.; 3018 //if(!IsIceOnlyInElement()) return 0;3019 3018 3020 3019 int domaintype; … … 5447 5446 #endif 5448 5447 #ifdef _HAVE_SEALEVELRISE_ 5449 IssmDouble Tria::OceanArea(void){ /*{{{*/ 5450 5451 if(IsOceanInElement()) return GetAreaSpherical(); 5452 else return 0; 5453 5454 } 5455 /*}}}*/ 5456 IssmDouble Tria::OceanAverage(IssmDouble* Sg){ /*{{{*/ 5457 5458 if(IsOceanInElement()){ 5448 IssmDouble Tria::OceanAverage(IssmDouble* Sg, SealevelMasks* masks){ /*{{{*/ 5449 5450 if(masks->isoceanin[this->lid]){ 5459 5451 5460 5452 IssmDouble area; … … 5473 5465 } 5474 5466 /*}}}*/ 5475 void Tria::SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, IssmDouble eartharea){/*{{{*/5467 void Tria::SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, SealevelMasks* masks, IssmDouble eartharea){/*{{{*/ 5476 5468 /*early return if we are not on an ice cap OR ocean:*/ 5477 if(! IsIceOnlyInElement() && !IsOceanInElement()){5469 if(!masks->isiceonly[this->lid] && !masks->isoceanin[this->lid]){ 5478 5470 dI_list[0] = 0.0; // this is important!!! 5479 5471 dI_list[1] = 0.0; // this is important!!! … … 5528 5520 re=(llr_list[0][2]+llr_list[1][2]+llr_list[2][2])/3.0; 5529 5521 5530 if( IsOceanInElement()){5522 if(masks->isoceanin[this->lid]){ 5531 5523 IssmDouble rho_water, S; 5532 5524 … … 5546 5538 dI_list[2] = +4*PI*(rho_water*S*area)*pow(re,4)*(1-pow(sin(late),2))/eartharea; 5547 5539 } 5548 else if( IsIceOnlyInElement()){5540 else if(masks->isiceonly[this->lid]){ 5549 5541 IssmDouble rho_ice, I; 5550 5542 … … 5564 5556 return; 5565 5557 }/*}}}*/ 5558 void Tria::SetSealevelMasks(SealevelMasks* masks){ /*{{{*/ 5559 5560 masks->isiceonly[this->lid]=this->IsIceOnlyInElement(); 5561 masks->isoceanin[this->lid]=this->IsOceanInElement(); 5562 5563 /*are we fully floating:*/ 5564 Input2* gr_input=this->GetInput2(MaskOceanLevelsetEnum); _assert_(gr_input); 5565 if (gr_input->GetInputMax()<=0)masks->isfullyfloating[this->lid]=true; 5566 else masks->isfullyfloating[this->lid]=false; 5567 5568 /*are we not fully grounded: */ 5569 if ((gr_input->GetInputMin())<0) masks->notfullygrounded[this->lid]=true; 5570 else masks->notfullygrounded[this->lid]=false; 5571 5572 } 5573 /*}}}*/ 5566 5574 void Tria::SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius){ /*{{{*/ 5567 5575 … … 5653 5661 } 5654 5662 /*}}}*/ 5655 void Tria::SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/5663 void Tria::SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 5656 5664 5657 5665 /*Computational flags:*/ … … 5661 5669 this->parameters->FindParam(&bp_compute_fingerprints,DslComputeFingerprintsEnum); 5662 5670 5663 if(! IsOceanInElement()){5671 if(!masks->isoceanin[this->lid]){ 5664 5672 /*ok, there is ocean in this element, we should compute eustatic loads for the ocean if we have requested 5665 5673 *bottom pressure fingerprints:*/ … … 5668 5676 //if(!IsIceInElement()){ 5669 5677 /*there is ice in this eleemnt, let's compute the eustatic response for ice changes:*/ 5670 this->SealevelriseEustaticIce(Sgi,peustatic, latitude,longitude,radius,oceanarea,eartharea);5678 this->SealevelriseEustaticIce(Sgi,peustatic,masks, latitude,longitude,radius,oceanarea,eartharea); 5671 5679 //} 5672 5680 5673 5681 } 5674 5682 /*}}}*/ 5675 void Tria::SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/5683 void Tria::SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 5676 5684 5677 5685 /*diverse:*/ … … 5708 5716 5709 5717 /*early return if we are not on an ice cap:*/ 5710 if(! IsIceOnlyInElement()){5718 if(!masks->isiceonly[this->lid]){ 5711 5719 constant=0; this->AddInput2(SealevelEustaticMaskEnum,&constant,P0Enum); 5712 5720 *peustatic=0; //do not forget to assign this pointer, otherwise, global eustatic will be garbage! … … 5715 5723 5716 5724 /*early return if we are fully floating:*/ 5717 Input2* gr_input=this->GetInput2(MaskOceanLevelsetEnum); _assert_(gr_input); 5718 if (gr_input->GetInputMax()<=0){ 5725 if (masks->isfullyfloating[this->lid]){ 5719 5726 constant=0; this->AddInput2(SealevelEustaticMaskEnum,&constant,P0Enum); 5720 5727 *peustatic=0; //do not forget to assign this pointer, otherwise, global eustatic will be garbage! … … 5723 5730 5724 5731 /*If we are here, we are on ice that is fully grounded or half-way to floating:*/ 5725 if ((gr_input->GetInputMin())<0){ 5726 notfullygrounded=true; //used later on. 5727 } 5732 if (masks->notfullygrounded[this->lid]) notfullygrounded=true; //used later on. 5728 5733 5729 5734 /*Inform mask: */ … … 5831 5836 } 5832 5837 /*}}}*/ 5833 void Tria::SealevelriseEustaticBottomPressure(IssmDouble* Sgi,IssmDouble* peustatic, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/5838 void Tria::SealevelriseEustaticBottomPressure(IssmDouble* Sgi,IssmDouble* peustatic, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 5834 5839 5835 5840 /*diverse:*/ … … 5977 5982 } 5978 5983 /*}}}*/ 5979 void Tria::SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){ /*{{{*/5984 void Tria::SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old, SealevelMasks* masks,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){ /*{{{*/ 5980 5985 5981 5986 /*diverse:*/ … … 6011 6016 6012 6017 /*early return if we are not on the ocean:*/ 6013 if (! IsOceanInElement()){6018 if (!masks->isoceanin[this->lid]){ 6014 6019 constant=0; this->AddInput2(SealevelEustaticOceanMaskEnum,&constant,P0Enum); 6015 6020 return; … … 6076 6081 } 6077 6082 /*}}}*/ 6078 void Tria::SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North ,IssmDouble* East,IssmDouble* Sg, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){ /*{{{*/6083 void Tria::SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North ,IssmDouble* East,IssmDouble* Sg, SealevelMasks* masks, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){ /*{{{*/ 6079 6084 6080 6085 /*diverse:*/ … … 6116 6121 6117 6122 /*early return if we are not on the ocean or on an ice cap:*/ 6118 if(! IsIceOnlyInElement() && !IsOceanInElement()) return;6123 if(!masks->isiceonly[this->lid] && !masks->isoceanin[this->lid]) return; 6119 6124 6120 6125 /*early return if we are fully floating: */ 6121 Input2* gr_input=this->GetInput2(MaskOceanLevelsetEnum); _assert_(gr_input); 6122 if(gr_input->GetInputMax()<=0)return; 6126 if(masks->isfullyfloating[this->lid])return; 6123 6127 6124 6128 /*recover computational flags: */ … … 6185 6189 6186 6190 /*we are going to use the result of these masks a lot: */ 6187 bool isiceonlyinelement= IsIceOnlyInElement();6188 bool isoceaninelement= IsOceanInElement();6191 bool isiceonlyinelement=masks->isiceonly[this->lid]; 6192 bool isoceaninelement=masks->isoceanin[this->lid]; 6189 6193 6190 6194 for(int i=0;i<gsize;i++){ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r24924 r24938 163 163 #endif 164 164 #ifdef _HAVE_SEALEVELRISE_ 165 IssmDouble OceanA rea(void);166 IssmDouble OceanAverage(IssmDouble* Sg);167 void Se alevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea);165 IssmDouble OceanAverage(IssmDouble* Sg, SealevelMasks* masks); 166 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,SealevelMasks* masks, IssmDouble eartharea); 167 void SetSealevelMasks(SealevelMasks* masks); 168 168 void SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius); 169 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea);170 void SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea);169 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,SealevelMasks* masks, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea); 170 void SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic,SealevelMasks* masks, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea); 171 171 void SealevelriseEustaticBottomPressure(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea); 172 void SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea);173 void SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz);172 void SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old,SealevelMasks* masks, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea); 173 void SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg,SealevelMasks* masks, IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz); 174 174 #endif 175 175 /*}}}*/ -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r24924 r24938 4694 4694 } 4695 4695 /*}}}*/ 4696 void FemModel::SealevelriseEustatic(Vector<IssmDouble>* pRSLgi, IssmDouble* peartharea, IssmDouble* poceanarea, IssmDouble* peustatic, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,int loop) { /*{{{*/4696 void FemModel::SealevelriseEustatic(Vector<IssmDouble>* pRSLgi, IssmDouble* peartharea, IssmDouble* poceanarea, IssmDouble* peustatic, SealevelMasks* masks, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,int loop) { /*{{{*/ 4697 4697 4698 4698 /*serialized vectors:*/ … … 4717 4717 IssmDouble area=element->GetAreaSpherical(); 4718 4718 eartharea_cpu += area; 4719 if (element->IsOceanInElement()) oceanarea_cpu += area;4719 if (masks->isoceanin[i]) oceanarea_cpu += area; 4720 4720 } 4721 4721 ISSM_MPI_Reduce (&oceanarea_cpu,&oceanarea,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); … … 4729 4729 for(int i=0;i<elements->Size();i++){ 4730 4730 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4731 element->SealevelriseEustatic(RSLgi,&eustatic_cpu_e, latitude,longitude,radius,oceanarea,eartharea);4731 element->SealevelriseEustatic(RSLgi,&eustatic_cpu_e,masks, latitude,longitude,radius,oceanarea,eartharea); 4732 4732 eustatic_cpu+=eustatic_cpu_e; 4733 4733 } … … 4753 4753 } 4754 4754 /*}}}*/ 4755 void FemModel::SealevelriseNonEustatic(Vector<IssmDouble>* pRSLgo, Vector<IssmDouble>* pRSLg_old, IssmDouble eartharea, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, bool verboseconvolution,int loop){/*{{{*/4755 void FemModel::SealevelriseNonEustatic(Vector<IssmDouble>* pRSLgo, Vector<IssmDouble>* pRSLg_old, IssmDouble eartharea, SealevelMasks* masks, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, bool verboseconvolution,int loop){/*{{{*/ 4756 4756 4757 4757 /*serialized vectors:*/ … … 4774 4774 for(int i=0;i<elements->Size();i++){ 4775 4775 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4776 element->SealevelriseNonEustatic(RSLgo,RSLg_old, latitude,longitude,radius,eartharea);4776 element->SealevelriseNonEustatic(RSLgo,RSLg_old,masks, latitude,longitude,radius,eartharea); 4777 4777 } 4778 4778 pRSLgo->SetValues(gsize,indices,RSLgo,ADD_VAL); … … 4786 4786 } 4787 4787 /*}}}*/ 4788 void FemModel::SealevelriseRotationalFeedback(Vector<IssmDouble>* pRSLgo_rot, Vector<IssmDouble>* pRSLg_old, IssmDouble* pIxz, IssmDouble* pIyz, IssmDouble* pIzz, IssmDouble eartharea, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius){/*{{{*/4788 void FemModel::SealevelriseRotationalFeedback(Vector<IssmDouble>* pRSLgo_rot, Vector<IssmDouble>* pRSLg_old, IssmDouble* pIxz, IssmDouble* pIyz, IssmDouble* pIzz, IssmDouble eartharea, SealevelMasks* masks, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius){/*{{{*/ 4789 4789 4790 4790 /*serialized vectors:*/ … … 4802 4802 for(int i=0;i<elements->Size();i++){ 4803 4803 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4804 element->SealevelriseMomentOfInertia(&moi_list[0],RSLg_old, eartharea);4804 element->SealevelriseMomentOfInertia(&moi_list[0],RSLg_old,masks, eartharea); 4805 4805 moi_list_cpu[0] += moi_list[0]; 4806 4806 moi_list_cpu[1] += moi_list[1]; … … 4862 4862 } 4863 4863 /*}}}*/ 4864 void FemModel::SealevelriseElastic(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, Vector<IssmDouble>* pRSLg, IssmDouble eartharea, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz,int loop,int horiz){/*{{{*/4864 void FemModel::SealevelriseElastic(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, Vector<IssmDouble>* pRSLg, IssmDouble eartharea, SealevelMasks* masks, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz,int loop,int horiz){/*{{{*/ 4865 4865 4866 4866 /*serialized vectors:*/ … … 4888 4888 for(int i=0;i<elements->Size();i++){ 4889 4889 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4890 element->SealevelriseGeodetic(Up,North,East,RSLg, latitude,longitude,radius,xx,yy,zz,eartharea,horiz);4890 element->SealevelriseGeodetic(Up,North,East,RSLg,masks, latitude,longitude,radius,xx,yy,zz,eartharea,horiz); 4891 4891 } 4892 4892 … … 4908 4908 } 4909 4909 /*}}}*/ 4910 IssmDouble FemModel::SealevelriseOceanAverage(Vector<IssmDouble>* RSLg, IssmDouble oceanarea) { /*{{{*/4910 IssmDouble FemModel::SealevelriseOceanAverage(Vector<IssmDouble>* RSLg,SealevelMasks* masks, IssmDouble oceanarea) { /*{{{*/ 4911 4911 4912 4912 IssmDouble* RSLg_serial=NULL; … … 4922 4922 for(int i=0;i<elements->Size();i++){ 4923 4923 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4924 oceanvalue_cpu += element->OceanAverage(RSLg_serial );4924 oceanvalue_cpu += element->OceanAverage(RSLg_serial,masks); 4925 4925 } 4926 4926 -
issm/trunk-jpl/src/c/classes/FemModel.h
r24924 r24938 18 18 class Loads; 19 19 class Materials; 20 class SealevelMasks; 20 21 class Profiler; 21 22 class Elements; … … 162 163 #endif 163 164 #ifdef _HAVE_SEALEVELRISE_ 164 void SealevelriseEustatic(Vector<IssmDouble>* pSgi, IssmDouble* peartharea, IssmDouble* poceanarea, IssmDouble* peustatic, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,int loop);165 void SealevelriseEustatic(Vector<IssmDouble>* pSgi, IssmDouble* peartharea, IssmDouble* poceanarea, IssmDouble* peustatic, SealevelMasks* masks, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,int loop); 165 166 void SealevelriseGeometry(IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius); 166 void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo, Vector<IssmDouble>* pSg_old, IssmDouble eartharea, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,bool verboseconvolution,int loop);167 void SealevelriseRotationalFeedback(Vector<IssmDouble>* pRSLgo_rot, Vector<IssmDouble>* pRSLg_old, IssmDouble* pIxz, IssmDouble* pIyz, IssmDouble* pIzz, IssmDouble eartharea, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius);168 void SealevelriseElastic(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, Vector<IssmDouble>* pSg_old, IssmDouble eartharea, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz,int loop,int horiz);169 IssmDouble SealevelriseOceanAverage(Vector<IssmDouble>* Sg, IssmDouble oceanarea);167 void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo, Vector<IssmDouble>* pSg_old, IssmDouble eartharea, SealevelMasks* masks, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,bool verboseconvolution,int loop); 168 void SealevelriseRotationalFeedback(Vector<IssmDouble>* pRSLgo_rot, Vector<IssmDouble>* pRSLg_old, IssmDouble* pIxz, IssmDouble* pIyz, IssmDouble* pIzz, IssmDouble eartharea,SealevelMasks* masks, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius); 169 void SealevelriseElastic(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, Vector<IssmDouble>* pSg_old, IssmDouble eartharea,SealevelMasks* masks, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz,int loop,int horiz); 170 IssmDouble SealevelriseOceanAverage(Vector<IssmDouble>* Sg,SealevelMasks* masks, IssmDouble oceanarea); 170 171 #endif 171 172 void HydrologyEPLupdateDomainx(IssmDouble* pEplcount); -
issm/trunk-jpl/src/c/classes/classes.h
r24379 r24938 18 18 #include "./Massfluxatgate.h" 19 19 #include "./Misfit.h" 20 #include "./SealevelMasks.h" 20 21 #include "./Nodalvalue.h" 21 22 #include "./Numberedcostfunction.h" -
issm/trunk-jpl/src/c/cores/cores.h
r24924 r24938 9 9 class FemModel; 10 10 class Parameters; 11 class SealevelMasks; 11 12 template <class doubletype> class Matrix; 12 13 template <class doubletype> class Vector; … … 56 57 void steric_core(FemModel* femmodel); 57 58 void sealevelrise_core_geometry(FemModel* femmodel); 58 Vector<IssmDouble>* sealevelrise_core_eustatic(FemModel* femmodel,IssmDouble* peartharea,IssmDouble* poceanarea); 59 Vector<IssmDouble>* sealevelrise_core_noneustatic(FemModel* femmodel,Vector<IssmDouble>* RSLg_eustatic,IssmDouble eartharea,IssmDouble oceanarea); 60 void sealevelrise_core_elastic(Vector<IssmDouble>** pU_radial, Vector<IssmDouble>** pU_north,Vector<IssmDouble>** pU_east,FemModel* femmodel,Vector<IssmDouble>* RSLg,IssmDouble eartharea); 59 SealevelMasks* sealevelrise_core_masks(FemModel* femmodel); 60 Vector<IssmDouble>* sealevelrise_core_eustatic(FemModel* femmodel,SealevelMasks* mask, IssmDouble* peartharea,IssmDouble* poceanarea); 61 Vector<IssmDouble>* sealevelrise_core_noneustatic(FemModel* femmodel,SealevelMasks* masks, Vector<IssmDouble>* RSLg_eustatic,IssmDouble eartharea,IssmDouble oceanarea); 62 void sealevelrise_core_elastic(Vector<IssmDouble>** pU_radial, Vector<IssmDouble>** pU_north,Vector<IssmDouble>** pU_east,FemModel* femmodel,Vector<IssmDouble>* RSLg,IssmDouble eartharea, SealevelMasks* masks); 61 63 void sealevelrise_core_viscous(Vector<IssmDouble>** pU_gia,Vector<IssmDouble>** pN_gia,FemModel* femmodel,Vector<IssmDouble>* RSLg); 62 64 void sealevelrise_diagnostics(FemModel* femmodel,Vector<IssmDouble>* RSLg); -
issm/trunk-jpl/src/c/cores/sealevelrise_core.cpp
r24934 r24938 85 85 Vector<IssmDouble> *N_gia_rate= NULL; 86 86 Vector<IssmDouble> *U_gia_rate= NULL; 87 SealevelMasks* masks=NULL; 87 88 88 89 /*parameters:*/ … … 148 149 if(modelid==earthid){ 149 150 151 /*call masks core: */ 152 masks=sealevelrise_core_masks(femmodel); 153 150 154 /*call eustatic core (generalized eustatic - Farrel and Clark, Eq 4, 1st, 3rd and 4rd terms on the RHS) */ 151 RSLg_eustatic=sealevelrise_core_eustatic(femmodel, &eartharea,&oceanarea);155 RSLg_eustatic=sealevelrise_core_eustatic(femmodel,masks,&eartharea,&oceanarea); 152 156 153 157 /*call non-eustatic core (ocean loading tems - 2nd and 5th terms on the RHS of Farrel and Clark) */ 154 RSLg=sealevelrise_core_noneustatic(femmodel, RSLg_eustatic,eartharea,oceanarea);158 RSLg=sealevelrise_core_noneustatic(femmodel,masks,RSLg_eustatic,eartharea,oceanarea); 155 159 156 160 /*compute other elastic geodetic signatures, such as components of 3-D crustal motion: */ 157 sealevelrise_core_elastic(&U_esa,&U_north_esa,&U_east_esa,femmodel,RSLg,eartharea );161 sealevelrise_core_elastic(&U_esa,&U_north_esa,&U_east_esa,femmodel,RSLg,eartharea,masks); 158 162 159 163 /*compute viscosus (GIA) geodetic signatures:*/ … … 223 227 delete N_gia_rate; 224 228 delete U_gia_rate; 229 //delete masks; 225 230 /*}}}*/ 226 231 … … 307 312 } 308 313 /*}}}*/ 314 SealevelMasks* sealevelrise_core_masks(FemModel* femmodel) { /*{{{*/ 315 316 if(VerboseSolution()) _printf0_(" computing sea level masks\n"); 317 318 /*initialize SealevelMasks structure: */ 319 SealevelMasks* masks=new SealevelMasks(femmodel->elements->Size()); 320 321 /*go through elements and fill the masks: */ 322 for (int i=0;i<femmodel->elements->Size();i++){ 323 324 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 325 element->SetSealevelMasks(masks); 326 } 327 328 return masks; 329 }/*}}}*/ 309 330 void sealevelrise_core_geometry(FemModel* femmodel) { /*{{{*/ 310 331 … … 333 354 334 355 }/*}}}*/ 335 Vector<IssmDouble>* sealevelrise_core_eustatic(FemModel* femmodel, IssmDouble* peartharea,IssmDouble* poceanarea){ /*{{{*/356 Vector<IssmDouble>* sealevelrise_core_eustatic(FemModel* femmodel,SealevelMasks* masks, IssmDouble* peartharea,IssmDouble* poceanarea){ /*{{{*/ 336 357 337 358 /*Eustatic core of the SLR solution (terms that are constant with respect to sea-level)*/ … … 367 388 368 389 /*call the eustatic main module: */ 369 femmodel->SealevelriseEustatic(RSLgi,&eartharea, &oceanarea,&eustatic, latitude, longitude, radius,loop); //this computes390 femmodel->SealevelriseEustatic(RSLgi,&eartharea, &oceanarea,&eustatic, masks, latitude, longitude, radius,loop); //this computes 370 391 371 392 /*we need to average RSLgi over the ocean: RHS term 4 in Eq.4 of Farrel and clarke. Only the elements can do that: */ 372 RSLgi_oceanaverage=femmodel->SealevelriseOceanAverage(RSLgi, oceanarea);393 RSLgi_oceanaverage=femmodel->SealevelriseOceanAverage(RSLgi,masks, oceanarea); 373 394 374 395 /*RSLg is the sum of the pure eustatic component (term 3) and the contribution from the perturbation to the graviation potential due to the … … 389 410 return RSLgi; 390 411 }/*}}}*/ 391 Vector<IssmDouble>* sealevelrise_core_noneustatic(FemModel* femmodel, Vector<IssmDouble>* RSLg_eustatic,IssmDouble eartharea,IssmDouble oceanarea){ /*{{{*/412 Vector<IssmDouble>* sealevelrise_core_noneustatic(FemModel* femmodel, SealevelMasks* masks, Vector<IssmDouble>* RSLg_eustatic,IssmDouble eartharea,IssmDouble oceanarea){ /*{{{*/ 392 413 393 414 /*sealevelrise_core_noneustatic.cpp //this computes the contributions from Eq.4 of Farrel and Clarke, rhs terms 2 and 5. … … 458 479 459 480 /*call the non eustatic module: */ 460 femmodel->SealevelriseNonEustatic(RSLgo, RSLg_old, eartharea, latitude,longitude, radius,verboseconvolution,loop);481 femmodel->SealevelriseNonEustatic(RSLgo, RSLg_old, eartharea, masks, latitude,longitude, radius,verboseconvolution,loop); 461 482 462 483 /*assemble solution vector: */ … … 467 488 /*call rotational feedback module: */ 468 489 RSLgo_rot = new Vector<IssmDouble>(gsize); RSLgo_rot->Assemble(); 469 femmodel->SealevelriseRotationalFeedback(RSLgo_rot,RSLg_old,&Ixz,&Iyz,&Izz, eartharea,latitude,longitude,radius);490 femmodel->SealevelriseRotationalFeedback(RSLgo_rot,RSLg_old,&Ixz,&Iyz,&Izz, eartharea, masks, latitude,longitude,radius); 470 491 RSLgo_rot->Assemble(); 471 492 … … 479 500 480 501 /*we need to average RSLgo over the ocean: RHS term 5 in Eq.4 of Farrel and clarke. Only the elements can do that: */ 481 RSLgo_oceanaverage=femmodel->SealevelriseOceanAverage(RSLgo, oceanarea);502 RSLgo_oceanaverage=femmodel->SealevelriseOceanAverage(RSLgo,masks, oceanarea); 482 503 483 504 /*RSLg is the sum of the eustatic term, and the ocean terms: */ … … 516 537 return RSLg; 517 538 } /*}}}*/ 518 void sealevelrise_core_elastic(Vector<IssmDouble>** pU_esa, Vector<IssmDouble>** pU_north_esa,Vector<IssmDouble>** pU_east_esa,FemModel* femmodel,Vector<IssmDouble>* RSLg,IssmDouble eartharea ){ /*{{{*/539 void sealevelrise_core_elastic(Vector<IssmDouble>** pU_esa, Vector<IssmDouble>** pU_north_esa,Vector<IssmDouble>** pU_east_esa,FemModel* femmodel,Vector<IssmDouble>* RSLg,IssmDouble eartharea, SealevelMasks* masks){ /*{{{*/ 519 540 520 541 Vector<IssmDouble> *U_esa = NULL; … … 556 577 557 578 /*call the elastic main modlule:*/ 558 femmodel->SealevelriseElastic(U_esa,U_north_esa,U_east_esa,RSLg,eartharea, latitude,longitude,radius,xx,yy,zz,loop,horiz);579 femmodel->SealevelriseElastic(U_esa,U_north_esa,U_east_esa,RSLg,eartharea, masks, latitude,longitude,radius,xx,yy,zz,loop,horiz); 559 580 560 581 /*Assign output pointers:*/
Note:
See TracChangeset
for help on using the changeset viewer.