Changeset 24924
- Timestamp:
- 05/29/20 19:08:11 (5 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.h
r24915 r24924 378 378 virtual void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea)=0; 379 379 virtual void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea)=0; 380 virtual void SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius)=0; 380 381 virtual void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea)=0; 381 382 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; -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r24915 r24924 215 215 IssmDouble OceanAverage(IssmDouble* Sg){_error_("not implemented yet!");}; 216 216 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea){_error_("not implemented yet!");}; 217 void SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius){_error_("not implemented yet!");}; 217 218 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 218 219 void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r24915 r24924 173 173 #ifdef _HAVE_SEALEVELRISE_ 174 174 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea){_error_("not implemented yet!");}; 175 void SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius){_error_("not implemented yet!");}; 175 176 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 176 177 void SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r24915 r24924 179 179 #ifdef _HAVE_SEALEVELRISE_ 180 180 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea){_error_("not implemented yet!");}; 181 void SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius){_error_("not implemented yet!");}; 181 182 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 182 183 void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r24921 r24924 5564 5564 return; 5565 5565 }/*}}}*/ 5566 void Tria::SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 5567 5568 /*Computational flags:*/ 5569 int bp_compute_fingerprints= 0; 5570 5571 /*some paramters first: */ 5572 this->parameters->FindParam(&bp_compute_fingerprints,DslComputeFingerprintsEnum); 5573 5574 if(!IsOceanInElement()){ 5575 /*ok, there is ocean in this element, we should compute eustatic loads for the ocean if we have requested 5576 *bottom pressure fingerprints:*/ 5577 if(bp_compute_fingerprints)this->SealevelriseEustaticBottomPressure(Sgi,peustatic,latitude,longitude,radius,oceanarea,eartharea); 5578 } 5579 //if(!IsIceInElement()){ 5580 /*there is ice in this eleemnt, let's compute the eustatic response for ice changes:*/ 5581 this->SealevelriseEustaticIce(Sgi,peustatic,latitude,longitude,radius,oceanarea,eartharea); 5582 //} 5583 5584 } 5585 /*}}}*/ 5586 void Tria::SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 5566 void Tria::SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius){ /*{{{*/ 5587 5567 5588 5568 /*diverse:*/ … … 5595 5575 IssmDouble late,longe,re; 5596 5576 IssmDouble lati,longi,ri; 5597 bool notfullygrounded=false;5598 5577 5599 5578 /*elastic green function:*/ 5600 int index; 5601 IssmDouble* G_elastic_precomputed=NULL; 5602 IssmDouble* G_rigid_precomputed=NULL; 5579 IssmDouble* indices=NULL; 5603 5580 int M; 5604 5605 /*ice properties: */ 5606 IssmDouble rho_ice,rho_water,rho_earth; 5607 5608 /*constants:*/ 5609 IssmDouble constant=0; 5610 5611 /*Initialize eustatic component: do not skip this step :):*/ 5612 IssmDouble eustatic = 0.; 5581 IssmDouble* dummypointer=NULL; 5613 5582 5614 5583 /*Computational flags:*/ 5615 5584 bool computerigid = true; 5616 bool computeelastic= true; 5617 bool scaleoceanarea= false; 5618 5619 /*early return if we are not on an ice cap:*/ 5620 if(!IsIceOnlyInElement()){ 5621 constant=0; this->AddInput2(SealevelEustaticMaskEnum,&constant,P0Enum); 5622 *peustatic=0; //do not forget to assign this pointer, otherwise, global eustatic will be garbage! 5623 return; 5624 } 5625 5626 /*early return if we are fully floating:*/ 5627 Input2* gr_input=this->GetInput2(MaskOceanLevelsetEnum); _assert_(gr_input); 5628 if (gr_input->GetInputMax()<=0){ 5629 constant=0; this->AddInput2(SealevelEustaticMaskEnum,&constant,P0Enum); 5630 *peustatic=0; //do not forget to assign this pointer, otherwise, global eustatic will be garbage! 5631 return; 5632 } 5633 5634 /*If we are here, we are on ice that is fully grounded or half-way to floating:*/ 5635 if ((gr_input->GetInputMin())<0){ 5636 notfullygrounded=true; //used later on. 5637 } 5638 5639 /*Inform mask: */ 5640 constant=1; this->AddInput2(SealevelEustaticMaskEnum,&constant,P0Enum); 5641 5642 /*recover material parameters: */ 5643 rho_ice=FindParam(MaterialsRhoIceEnum); 5644 rho_water=FindParam(MaterialsRhoSeawaterEnum); 5645 rho_earth=FindParam(MaterialsEarthDensityEnum); 5646 5647 /*recover love numbers and computational flags: */ 5585 5586 /*recover computational flags: */ 5648 5587 this->parameters->FindParam(&computerigid,SealevelriseRigidEnum); 5649 this->parameters->FindParam(&computeelastic,SealevelriseElasticEnum); 5650 this->parameters->FindParam(&scaleoceanarea,SealevelriseOceanAreaScalingEnum); 5651 5652 /*recover elastic green function:*/ 5653 DoubleVecParam* parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelriseGRigidEnum)); _assert_(parameter); 5654 parameter->GetParameterValueByPointer(&G_rigid_precomputed,&M); 5655 5656 if(computeelastic){ 5657 parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelriseGElasticEnum)); _assert_(parameter); 5658 parameter->GetParameterValueByPointer(&G_elastic_precomputed,&M); 5659 } 5588 if(!computerigid) return; //we are running eustatic solution only. 5660 5589 5661 5590 /*how many dofs are we working with here? */ 5662 5591 this->parameters->FindParam(&gsize,MeshNumberofverticesEnum); 5592 5593 /*recover size of indexed tables:*/ 5594 DoubleVecParam* parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelriseGRigidEnum)); _assert_(parameter); 5595 parameter->GetParameterValueByPointer(&dummypointer,&M); 5596 5597 /*allocate indices:*/ 5598 indices=xNew<IssmDouble>(gsize); 5663 5599 5664 5600 /* Where is the centroid of this element?:{{{*/ … … 5700 5636 longe=longe/180*PI; 5701 5637 /*}}}*/ 5638 5639 for(int i=0;i<gsize;i++){ 5640 IssmDouble alpha; 5641 IssmDouble delPhi,delLambda; 5642 5643 /*Compute alpha angle between centroid and current vertex and index into precomputed tables: */ 5644 lati=latitude[i]/180*PI; longi=longitude[i]/180*PI; 5645 delPhi=fabs(lati-late); delLambda=fabs(longi-longe); 5646 alpha=2.*asin(sqrt(pow(sin(delPhi/2),2.0)+cos(lati)*cos(late)*pow(sin(delLambda/2),2))); 5647 indices[i]=reCast<int,IssmDouble>(alpha/PI*reCast<IssmDouble,int>(M-1)); 5648 } 5649 5650 /*Add in inputs:*/ 5651 this->inputs2->SetArrayInput(SealevelriseIndicesEnum,this->lid,indices,gsize); 5652 5653 return; 5654 } 5655 /*}}}*/ 5656 void Tria::SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 5657 5658 /*Computational flags:*/ 5659 int bp_compute_fingerprints= 0; 5660 5661 /*some paramters first: */ 5662 this->parameters->FindParam(&bp_compute_fingerprints,DslComputeFingerprintsEnum); 5663 5664 if(!IsOceanInElement()){ 5665 /*ok, there is ocean in this element, we should compute eustatic loads for the ocean if we have requested 5666 *bottom pressure fingerprints:*/ 5667 if(bp_compute_fingerprints)this->SealevelriseEustaticBottomPressure(Sgi,peustatic,latitude,longitude,radius,oceanarea,eartharea); 5668 } 5669 //if(!IsIceInElement()){ 5670 /*there is ice in this eleemnt, let's compute the eustatic response for ice changes:*/ 5671 this->SealevelriseEustaticIce(Sgi,peustatic,latitude,longitude,radius,oceanarea,eartharea); 5672 //} 5673 5674 } 5675 /*}}}*/ 5676 void Tria::SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 5677 5678 /*diverse:*/ 5679 int gsize,dummy; 5680 bool spherical=true; 5681 IssmDouble llr_list[NUMVERTICES][3]; 5682 IssmDouble area; 5683 IssmDouble I; //change in ice thickness or water level(Farrel and Clarke, Equ. 4) 5684 IssmDouble rho; 5685 IssmDouble late,longe,re; 5686 IssmDouble lati,longi,ri; 5687 bool notfullygrounded=false; 5688 5689 /*elastic green function:*/ 5690 int index; 5691 IssmDouble* indices=NULL; 5692 IssmDouble* G_elastic_precomputed=NULL; 5693 IssmDouble* G_rigid_precomputed=NULL; 5694 int M; 5695 5696 /*ice properties: */ 5697 IssmDouble rho_ice,rho_water,rho_earth; 5698 5699 /*constants:*/ 5700 IssmDouble constant=0; 5701 5702 /*Initialize eustatic component: do not skip this step :):*/ 5703 IssmDouble eustatic = 0.; 5704 5705 /*Computational flags:*/ 5706 bool computerigid = true; 5707 bool computeelastic= true; 5708 bool scaleoceanarea= false; 5709 5710 /*early return if we are not on an ice cap:*/ 5711 if(!IsIceOnlyInElement()){ 5712 constant=0; this->AddInput2(SealevelEustaticMaskEnum,&constant,P0Enum); 5713 *peustatic=0; //do not forget to assign this pointer, otherwise, global eustatic will be garbage! 5714 return; 5715 } 5716 5717 /*early return if we are fully floating:*/ 5718 Input2* gr_input=this->GetInput2(MaskOceanLevelsetEnum); _assert_(gr_input); 5719 if (gr_input->GetInputMax()<=0){ 5720 constant=0; this->AddInput2(SealevelEustaticMaskEnum,&constant,P0Enum); 5721 *peustatic=0; //do not forget to assign this pointer, otherwise, global eustatic will be garbage! 5722 return; 5723 } 5724 5725 /*If we are here, we are on ice that is fully grounded or half-way to floating:*/ 5726 if ((gr_input->GetInputMin())<0){ 5727 notfullygrounded=true; //used later on. 5728 } 5729 5730 /*Inform mask: */ 5731 constant=1; this->AddInput2(SealevelEustaticMaskEnum,&constant,P0Enum); 5732 5733 /*recover material parameters: */ 5734 rho_ice=FindParam(MaterialsRhoIceEnum); 5735 rho_water=FindParam(MaterialsRhoSeawaterEnum); 5736 rho_earth=FindParam(MaterialsEarthDensityEnum); 5737 5738 /*recover love numbers and computational flags: */ 5739 this->parameters->FindParam(&computerigid,SealevelriseRigidEnum); 5740 this->parameters->FindParam(&computeelastic,SealevelriseElasticEnum); 5741 this->parameters->FindParam(&scaleoceanarea,SealevelriseOceanAreaScalingEnum); 5742 5743 /*recover elastic green function:*/ 5744 DoubleVecParam* parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelriseGRigidEnum)); _assert_(parameter); 5745 parameter->GetParameterValueByPointer(&G_rigid_precomputed,&M); 5746 5747 if(computeelastic){ 5748 parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelriseGElasticEnum)); _assert_(parameter); 5749 parameter->GetParameterValueByPointer(&G_elastic_precomputed,&M); 5750 } 5751 5752 /*how many dofs are we working with here? */ 5753 this->parameters->FindParam(&gsize,MeshNumberofverticesEnum); 5754 5755 /*retrieve indices:*/ 5756 if(computerigid){this->inputs2->GetArray(SealevelriseIndicesEnum,this->lid,&indices,&dummy); _assert_(dummy==gsize);} 5702 5757 5703 5758 /*Compute area of element. Scale it by grounded fraction if not fully grounded: */ … … 5755 5810 5756 5811 /*Compute alpha angle between centroid and current vertex and index into precomputed tables: */ 5757 lati=latitude[i]/180*PI; longi=longitude[i]/180*PI;5812 /*lati=latitude[i]/180*PI; longi=longitude[i]/180*PI; 5758 5813 delPhi=fabs(lati-late); delLambda=fabs(longi-longe); 5759 5814 alpha=2.*asin(sqrt(pow(sin(delPhi/2),2.0)+cos(lati)*cos(late)*pow(sin(delLambda/2),2))); 5760 index=reCast<int,IssmDouble>(alpha/PI*reCast<IssmDouble,int>(M-1)); 5815 index=reCast<int,IssmDouble>(alpha/PI*reCast<IssmDouble,int>(M-1));*/ 5816 index=reCast<int,IssmDouble>(indices[i]); 5761 5817 5762 5818 //Elastic component (from Eq 17 in Adhikari et al, GMD 2015) … … 5767 5823 } 5768 5824 } 5825 5826 /*Free ressources:*/ 5827 if(computerigid)xDelete<IssmDouble>(indices); 5769 5828 5770 5829 /*Assign output pointer:*/ … … 5924 5983 5925 5984 /*diverse:*/ 5926 int gsize ;5985 int gsize,dummy; 5927 5986 bool spherical=true; 5928 5987 IssmDouble llr_list[NUMVERTICES][3]; … … 5940 5999 int M; 5941 6000 int index; 6001 IssmDouble* indices=NULL; 5942 6002 IssmDouble alpha; 5943 6003 IssmDouble delPhi,delLambda; … … 5974 6034 this->parameters->FindParam(&gsize,MeshNumberofverticesEnum); 5975 6035 6036 /*retrieve indices:*/ 6037 if(computerigid){this->inputs2->GetArray(SealevelriseIndicesEnum,this->lid,&indices,&dummy); _assert_(dummy==gsize);} 6038 5976 6039 /*From Sg_old, recover water sea level rise:*/ 5977 6040 S=0; for(int i=0;i<NUMVERTICES;i++) S+=Sg_old[this->vertices[i]->Sid()]/NUMVERTICES; … … 5979 6042 /*Compute area of element:*/ 5980 6043 area=GetAreaSpherical(); 5981 5982 /* Where is the centroid of this element?:{{{*/5983 ::GetVerticesCoordinates(&llr_list[0][0],this->vertices,NUMVERTICES,spherical);5984 5985 minlong=400; maxlong=-20;5986 for (int i=0;i<NUMVERTICES;i++){5987 llr_list[i][0]=(90-llr_list[i][0]);5988 if(llr_list[i][1]<0)llr_list[i][1]=180+(180+llr_list[i][1]);5989 if(llr_list[i][1]>maxlong)maxlong=llr_list[i][1];5990 if(llr_list[i][1]<minlong)minlong=llr_list[i][1];5991 }5992 if(minlong==0 && maxlong>180){5993 if (llr_list[0][1]==0)llr_list[0][1]=360;5994 if (llr_list[1][1]==0)llr_list[1][1]=360;5995 if (llr_list[2][1]==0)llr_list[2][1]=360;5996 }5997 5998 // correction at the north pole5999 if(llr_list[0][0]==0)llr_list[0][1]=(llr_list[1][1]+llr_list[2][1])/2.0;6000 if(llr_list[1][0]==0)llr_list[1][1]=(llr_list[0][1]+llr_list[2][1])/2.0;6001 if(llr_list[2][0]==0)llr_list[2][1]=(llr_list[0][1]+llr_list[1][1])/2.0;6002 6003 //correction at the south pole6004 if(llr_list[0][0]==180)llr_list[0][1]=(llr_list[1][1]+llr_list[2][1])/2.0;6005 if(llr_list[1][0]==180)llr_list[1][1]=(llr_list[0][1]+llr_list[2][1])/2.0;6006 if(llr_list[2][0]==180)llr_list[2][1]=(llr_list[0][1]+llr_list[1][1])/2.0;6007 6008 late=(llr_list[0][0]+llr_list[1][0]+llr_list[2][0])/3.0;6009 longe=(llr_list[0][1]+llr_list[1][1]+llr_list[2][1])/3.0;6010 6011 late=90-late;6012 if(longe>180)longe=(longe-180)-180;6013 6014 late=late/180*PI;6015 longe=longe/180*PI;6016 /*}}}*/6017 6044 6018 6045 /*recover rigid and elastic green functions:*/ … … 6030 6057 6031 6058 /*Compute alpha angle between centroid and current vertex : */ 6032 lati=latitude[i]/180*PI; longi=longitude[i]/180*PI;6059 /*lati=latitude[i]/180*PI; longi=longitude[i]/180*PI; 6033 6060 delPhi=fabs(lati-late); delLambda=fabs(longi-longe); 6034 6061 alpha=2.*asin(sqrt(pow(sin(delPhi/2),2.0)+cos(lati)*cos(late)*pow(sin(delLambda/2),2))); 6035 index=reCast<int,IssmDouble>(alpha/PI*(M-1)); 6062 index=reCast<int,IssmDouble>(alpha/PI*(M-1));*/ 6063 6064 index=reCast<int,IssmDouble>(indices[i]); 6036 6065 6037 6066 /*Rigid earth gravitational perturbation: */ … … 6046 6075 } 6047 6076 6077 /*Free ressources:*/ 6078 if(computerigid)xDelete<IssmDouble>(indices); 6079 6048 6080 6049 6081 return; … … 6053 6085 6054 6086 /*diverse:*/ 6055 int gsize ;6087 int gsize,dummy; 6056 6088 bool spherical=true; 6057 6089 IssmDouble llr_list[NUMVERTICES][3]; … … 6069 6101 IssmDouble* H_elastic_precomputed = NULL; 6070 6102 int M; 6103 IssmDouble* indices=NULL; 6104 int index; 6071 6105 6072 6106 /*computation of Green functions:*/ … … 6109 6143 this->parameters->FindParam(&gsize,MeshNumberofverticesEnum); 6110 6144 6145 /*retrieve indices:*/ 6146 if(computerigid){this->inputs2->GetArray(SealevelriseIndicesEnum,this->lid,&indices,&dummy); _assert_(dummy==gsize);} 6147 6111 6148 /*compute area of element:*/ 6112 6149 area=GetAreaSpherical(); 6113 6114 /*element centroid (spherical): */6115 /* Where is the centroid of this element?:{{{*/6116 ::GetVerticesCoordinates(&llr_list[0][0],this->vertices,NUMVERTICES,spherical);6117 6118 minlong=400; maxlong=-20;6119 for (int i=0;i<NUMVERTICES;i++){6120 llr_list[i][0]=(90-llr_list[i][0]);6121 if(llr_list[i][1]<0)llr_list[i][1]=180+(180+llr_list[i][1]);6122 if(llr_list[i][1]>maxlong)maxlong=llr_list[i][1];6123 if(llr_list[i][1]<minlong)minlong=llr_list[i][1];6124 }6125 if(minlong==0 && maxlong>180){6126 if (llr_list[0][1]==0)llr_list[0][1]=360;6127 if (llr_list[1][1]==0)llr_list[1][1]=360;6128 if (llr_list[2][1]==0)llr_list[2][1]=360;6129 }6130 6131 // correction at the north pole6132 if(llr_list[0][0]==0)llr_list[0][1]=(llr_list[1][1]+llr_list[2][1])/2.0;6133 if(llr_list[1][0]==0)llr_list[1][1]=(llr_list[0][1]+llr_list[2][1])/2.0;6134 if(llr_list[2][0]==0)llr_list[2][1]=(llr_list[0][1]+llr_list[1][1])/2.0;6135 6136 //correction at the south pole6137 if(llr_list[0][0]==180)llr_list[0][1]=(llr_list[1][1]+llr_list[2][1])/2.0;6138 if(llr_list[1][0]==180)llr_list[1][1]=(llr_list[0][1]+llr_list[2][1])/2.0;6139 if(llr_list[2][0]==180)llr_list[2][1]=(llr_list[0][1]+llr_list[1][1])/2.0;6140 6141 late=(llr_list[0][0]+llr_list[1][0]+llr_list[2][0])/3.0;6142 longe=(llr_list[0][1]+llr_list[1][1]+llr_list[2][1])/3.0;6143 6144 late=90-late;6145 if(longe>180)longe=(longe-180)-180;6146 6147 late=late/180*PI;6148 longe=longe/180*PI;6149 /*}}}*/6150 6150 6151 6151 /*figure out gravity center of our element (Cartesian): */ … … 6192 6192 for(int i=0;i<gsize;i++){ 6193 6193 6194 //indices[i]=i;6195 6196 6194 /*Compute alpha angle between centroid and current vertex: */ 6197 lati=latitude[i]/180*PI; longi=longitude[i]/180*PI; 6198 6195 /*lati=latitude[i]/180*PI; longi=longitude[i]/180*PI; 6199 6196 delPhi=fabs(lati-late); delLambda=fabs(longi-longe); 6200 alpha=2.*asin(sqrt(pow(sin(delPhi/2),2.0)+cos(lati)*cos(late)*pow(sin(delLambda/2),2))); 6197 alpha=2.*asin(sqrt(pow(sin(delPhi/2),2.0)+cos(lati)*cos(late)*pow(sin(delLambda/2),2)));*/ 6198 6199 index=reCast<int,IssmDouble>(indices[i]); 6201 6200 6202 6201 /*Compute azimuths, both north and east components: */ … … 6215 6214 6216 6215 /*Elastic component (from Eq 17 in Adhikari et al, GMD 2015): */ 6217 int index=reCast<int,IssmDouble>(alpha/PI*(M-1));6218 6216 U_elastic[i] += U_elastic_precomputed[index]; 6219 6217 if(horiz){ … … 6240 6238 6241 6239 /*free ressources:*/ 6240 if(computerigid)xDelete<IssmDouble>(indices); 6242 6241 xDelete<IssmDouble>(U_values); 6243 6242 xDelete<IssmDouble>(U_elastic); -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r24915 r24924 166 166 IssmDouble OceanAverage(IssmDouble* Sg); 167 167 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea); 168 void SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius); 168 169 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea); 169 170 void SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea); -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r24917 r24924 4684 4684 #endif 4685 4685 #ifdef _HAVE_SEALEVELRISE_ 4686 void FemModel::SealevelriseGeometry(IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius) { /*{{{*/ 4687 4688 /*Run sealevelrie geometry routine in elements:*/ 4689 for(int i=0;i<elements->Size();i++){ 4690 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4691 element->SealevelriseGeometry(latitude,longitude,radius); 4692 } 4693 4694 } 4695 /*}}}*/ 4686 4696 void FemModel::SealevelriseEustatic(Vector<IssmDouble>* pRSLgi, IssmDouble* peartharea, IssmDouble* poceanarea, IssmDouble* peustatic, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,int loop) { /*{{{*/ 4687 4697 -
issm/trunk-jpl/src/c/classes/FemModel.h
r24916 r24924 163 163 #ifdef _HAVE_SEALEVELRISE_ 164 164 void SealevelriseEustatic(Vector<IssmDouble>* pSgi, IssmDouble* peartharea, IssmDouble* poceanarea, IssmDouble* peustatic, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,int loop); 165 void SealevelriseGeometry(IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius); 165 166 void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo, Vector<IssmDouble>* pSg_old, IssmDouble eartharea, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,bool verboseconvolution,int loop); 166 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); -
issm/trunk-jpl/src/c/cores/cores.h
r24916 r24924 55 55 void geodetic_core(FemModel* femmodel); 56 56 void steric_core(FemModel* femmodel); 57 void sealevelrise_core_geometry(FemModel* femmodel); 57 58 Vector<IssmDouble>* sealevelrise_core_eustatic(FemModel* femmodel,IssmDouble* peartharea,IssmDouble* poceanarea); 58 59 Vector<IssmDouble>* sealevelrise_core_noneustatic(FemModel* femmodel,Vector<IssmDouble>* RSLg_eustatic,IssmDouble eartharea,IssmDouble oceanarea); -
issm/trunk-jpl/src/c/cores/sealevelrise_core.cpp
r24916 r24924 41 41 /*set SLR configuration: */ 42 42 femmodel->SetCurrentConfiguration(SealevelriseAnalysisEnum); 43 44 /*run geometry core:*/ 45 sealevelrise_core_geometry(femmodel); 43 46 44 47 /*Run geodetic:*/ … … 304 307 } 305 308 /*}}}*/ 309 void sealevelrise_core_geometry(FemModel* femmodel) { /*{{{*/ 310 311 /*Geometry core where we compute indices into tables pre computed in the SealevelRiseAnalysis: */ 312 313 /*parameters: */ 314 bool spherical=true; 315 IssmDouble *latitude = NULL; 316 IssmDouble *longitude = NULL; 317 IssmDouble *radius = NULL; 318 319 /*Verbose: */ 320 if(VerboseSolution()) _printf0_(" computing geometrical offsets into precomputed Green tables \n"); 321 322 /*first, recover lat,long and radius vectors from vertices: */ 323 VertexCoordinatesx(&latitude,&longitude,&radius,femmodel->vertices,spherical); 324 325 /*call the FemModel geometry module: */ 326 femmodel->SealevelriseGeometry(latitude, longitude, radius); 327 328 /*Free ressources:*/ 329 xDelete<IssmDouble>(latitude); 330 xDelete<IssmDouble>(longitude); 331 xDelete<IssmDouble>(radius); 332 333 334 }/*}}}*/ 306 335 Vector<IssmDouble>* sealevelrise_core_eustatic(FemModel* femmodel,IssmDouble* peartharea,IssmDouble* poceanarea){ /*{{{*/ 307 336 -
issm/trunk-jpl/src/c/cores/transient_core.cpp
r24920 r24924 99 99 } 100 100 101 //if(isslr) sealevelrise_geometrycore(femmodel);101 if(isslr) sealevelrise_core_geometry(femmodel); 102 102 103 103 while(time < finaltime - (yts*DBL_EPSILON)){ //make sure we run up to finaltime. -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r24921 r24924 683 683 syn keyword cConstant SealevelriseSpcthicknessEnum 684 684 syn keyword cConstant SealevelriseHydroRateEnum 685 syn keyword cConstant SealevelriseIndicesEnum 685 686 syn keyword cConstant SedimentHeadEnum 686 687 syn keyword cConstant SedimentHeadOldEnum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r24921 r24924 680 680 SealevelriseSpcthicknessEnum, 681 681 SealevelriseHydroRateEnum, 682 SealevelriseIndicesEnum, 682 683 SedimentHeadEnum, 683 684 SedimentHeadOldEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r24921 r24924 685 685 case SealevelriseSpcthicknessEnum : return "SealevelriseSpcthickness"; 686 686 case SealevelriseHydroRateEnum : return "SealevelriseHydroRate"; 687 case SealevelriseIndicesEnum : return "SealevelriseIndices"; 687 688 case SedimentHeadEnum : return "SedimentHead"; 688 689 case SedimentHeadOldEnum : return "SedimentHeadOld"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r24921 r24924 700 700 else if (strcmp(name,"SealevelriseSpcthickness")==0) return SealevelriseSpcthicknessEnum; 701 701 else if (strcmp(name,"SealevelriseHydroRate")==0) return SealevelriseHydroRateEnum; 702 else if (strcmp(name,"SealevelriseIndices")==0) return SealevelriseIndicesEnum; 702 703 else if (strcmp(name,"SedimentHead")==0) return SedimentHeadEnum; 703 704 else if (strcmp(name,"SedimentHeadOld")==0) return SedimentHeadOldEnum; … … 751 752 else if (strcmp(name,"SmbMassBalanceClimate")==0) return SmbMassBalanceClimateEnum; 752 753 else if (strcmp(name,"SmbMassBalance")==0) return SmbMassBalanceEnum; 753 else if (strcmp(name,"SmbMassBalanceSubstep")==0) return SmbMassBalanceSubstepEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"SmbMassBalanceTransient")==0) return SmbMassBalanceTransientEnum; 757 if (strcmp(name,"SmbMassBalanceSubstep")==0) return SmbMassBalanceSubstepEnum; 758 else if (strcmp(name,"SmbMassBalanceTransient")==0) return SmbMassBalanceTransientEnum; 758 759 else if (strcmp(name,"SmbMeanLHF")==0) return SmbMeanLHFEnum; 759 760 else if (strcmp(name,"SmbMeanSHF")==0) return SmbMeanSHFEnum; … … 874 875 else if (strcmp(name,"Outputdefinition13")==0) return Outputdefinition13Enum; 875 876 else if (strcmp(name,"Outputdefinition14")==0) return Outputdefinition14Enum; 876 else if (strcmp(name,"Outputdefinition15")==0) return Outputdefinition15Enum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"Outputdefinition16")==0) return Outputdefinition16Enum; 880 if (strcmp(name,"Outputdefinition15")==0) return Outputdefinition15Enum; 881 else if (strcmp(name,"Outputdefinition16")==0) return Outputdefinition16Enum; 881 882 else if (strcmp(name,"Outputdefinition17")==0) return Outputdefinition17Enum; 882 883 else if (strcmp(name,"Outputdefinition18")==0) return Outputdefinition18Enum; … … 997 998 else if (strcmp(name,"BeckmannGoosseFloatingMeltRate")==0) return BeckmannGoosseFloatingMeltRateEnum; 998 999 else if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum; 999 else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"BoolInput")==0) return BoolInputEnum; 1003 if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum; 1004 else if (strcmp(name,"BoolInput")==0) return BoolInputEnum; 1004 1005 else if (strcmp(name,"BoolInput2")==0) return BoolInput2Enum; 1005 1006 else if (strcmp(name,"IntInput2")==0) return IntInput2Enum; … … 1120 1121 else if (strcmp(name,"IceVolumeAboveFloatation")==0) return IceVolumeAboveFloatationEnum; 1121 1122 else if (strcmp(name,"IceVolumeAboveFloatationScaled")==0) return IceVolumeAboveFloatationScaledEnum; 1122 else if (strcmp(name,"IceVolume")==0) return IceVolumeEnum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"IceVolumeScaled")==0) return IceVolumeScaledEnum; 1126 if (strcmp(name,"IceVolume")==0) return IceVolumeEnum; 1127 else if (strcmp(name,"IceVolumeScaled")==0) return IceVolumeScaledEnum; 1127 1128 else if (strcmp(name,"IcefrontMassFlux")==0) return IcefrontMassFluxEnum; 1128 1129 else if (strcmp(name,"IcefrontMassFluxLevelset")==0) return IcefrontMassFluxLevelsetEnum; … … 1243 1244 else if (strcmp(name,"PentaInput")==0) return PentaInputEnum; 1244 1245 else if (strcmp(name,"Profiler")==0) return ProfilerEnum; 1245 else if (strcmp(name,"ProfilingCurrentFlops")==0) return ProfilingCurrentFlopsEnum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"ProfilingCurrentMem")==0) return ProfilingCurrentMemEnum; 1249 if (strcmp(name,"ProfilingCurrentFlops")==0) return ProfilingCurrentFlopsEnum; 1250 else if (strcmp(name,"ProfilingCurrentMem")==0) return ProfilingCurrentMemEnum; 1250 1251 else if (strcmp(name,"ProfilingSolutionTime")==0) return ProfilingSolutionTimeEnum; 1251 1252 else if (strcmp(name,"Regionaloutput")==0) return RegionaloutputEnum;
Note:
See TracChangeset
for help on using the changeset viewer.