Changeset 24915
- Timestamp:
- 05/28/20 21:38:38 (5 years ago)
- Location:
- issm/trunk-jpl/src/c/classes
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.h
r24889 r24915 377 377 virtual IssmDouble OceanArea(void)=0; 378 378 virtual void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea)=0; 379 virtual void SealevelriseEustatic( Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea)=0;380 virtual void SealevelriseNonEustatic( Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea)=0;381 virtual void SealevelriseGeodetic( Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz)=0;379 virtual void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea)=0; 380 virtual void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea)=0; 381 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; 382 382 #endif 383 383 -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r24790 r24915 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 SealevelriseEustatic( Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");};218 void SealevelriseNonEustatic( Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");};219 void SealevelriseGeodetic( Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){_error_("not implemented yet!");};217 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 218 void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; 219 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!");}; 220 220 #endif 221 221 -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r24790 r24915 173 173 #ifdef _HAVE_SEALEVELRISE_ 174 174 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea){_error_("not implemented yet!");}; 175 void SealevelriseEustatic( Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");};176 void SealevelriseNonEustatic( Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");};177 void SealevelriseGeodetic( Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){_error_("not implemented yet!");};175 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 176 void SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; 177 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!");}; 178 178 IssmDouble OceanArea(void){_error_("not implemented yet!");}; 179 179 IssmDouble OceanAverage(IssmDouble* Sg){_error_("not implemented yet!");}; -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r24790 r24915 179 179 #ifdef _HAVE_SEALEVELRISE_ 180 180 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea){_error_("not implemented yet!");}; 181 void SealevelriseEustatic( Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");};182 void SealevelriseNonEustatic( Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");};183 void SealevelriseGeodetic( Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){_error_("not implemented yet!");};181 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){_error_("not implemented yet!");}; 182 void SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){_error_("not implemented yet!");}; 183 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!");}; 184 184 IssmDouble OceanArea(void){_error_("not implemented yet!");}; 185 185 IssmDouble OceanAverage(IssmDouble* Sg){_error_("not implemented yet!");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r24889 r24915 5564 5564 return; 5565 5565 }/*}}}*/ 5566 void Tria::SealevelriseEustatic( Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/5566 void Tria::SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 5567 5567 5568 5568 /*Computational flags:*/ … … 5575 5575 /*ok, there is ocean in this element, we should compute eustatic loads for the ocean if we have requested 5576 5576 *bottom pressure fingerprints:*/ 5577 if(bp_compute_fingerprints)this->SealevelriseEustaticBottomPressure( pSgi,peustatic,latitude,longitude,radius,oceanarea,eartharea);5577 if(bp_compute_fingerprints)this->SealevelriseEustaticBottomPressure(Sgi,peustatic,latitude,longitude,radius,oceanarea,eartharea); 5578 5578 } 5579 5579 //if(!IsIceInElement()){ 5580 5580 /*there is ice in this eleemnt, let's compute the eustatic response for ice changes:*/ 5581 this->SealevelriseEustaticIce( pSgi,peustatic,latitude,longitude,radius,oceanarea,eartharea);5581 this->SealevelriseEustaticIce(Sgi,peustatic,latitude,longitude,radius,oceanarea,eartharea); 5582 5582 //} 5583 5583 5584 5584 } 5585 5585 /*}}}*/ 5586 void Tria::SealevelriseEustaticIce( Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/5586 void Tria::SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 5587 5587 5588 5588 /*diverse:*/ … … 5744 5744 5745 5745 if(computeelastic | computerigid){ 5746 int* indices=xNew<int>(gsize);5747 IssmDouble* values=xNew<IssmDouble>(gsize);5748 5746 IssmDouble alpha; 5749 5747 IssmDouble delPhi,delLambda; 5750 5748 for(int i=0;i<gsize;i++){ 5751 indices[i]=i;5752 5749 5753 5750 IssmDouble G_rigid=0; //do not remove =0! … … 5757 5754 lati=latitude[i]/180*PI; longi=longitude[i]/180*PI; 5758 5755 5759 5756 delPhi=fabs(lati-late); delLambda=fabs(longi-longe); 5760 5757 alpha=2.*asin(sqrt(pow(sin(delPhi/2),2.0)+cos(lati)*cos(late)*pow(sin(delLambda/2),2))); 5761 5758 … … 5769 5766 } 5770 5767 5771 /*Add all components to the pSgi or pSgo solution vectors:*/ 5772 values[i]=3*rho_ice/rho_earth*area/eartharea*I*(G_rigid+G_elastic); 5773 } 5774 pSgi->SetValues(gsize,indices,values,ADD_VAL); 5775 5776 /*free ressources:*/ 5777 xDelete<IssmDouble>(values); 5778 xDelete<int>(indices); 5768 /*Add all components to the Sgi or Sgo solution vectors:*/ 5769 Sgi[i]+=3*rho_ice/rho_earth*area/eartharea*I*(G_rigid+G_elastic); 5770 5771 } 5779 5772 } 5780 5773 … … 5786 5779 } 5787 5780 /*}}}*/ 5788 void Tria::SealevelriseEustaticBottomPressure( Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/5781 void Tria::SealevelriseEustaticBottomPressure(IssmDouble* Sgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea){ /*{{{*/ 5789 5782 5790 5783 /*diverse:*/ … … 5898 5891 5899 5892 if(computeelastic | computerigid){ 5900 int* indices=xNew<int>(gsize);5901 IssmDouble* values=xNew<IssmDouble>(gsize);5902 5893 IssmDouble alpha; 5903 5894 IssmDouble delPhi,delLambda; 5904 5895 for(int i=0;i<gsize;i++){ 5905 indices[i]=i;5906 5896 5907 5897 IssmDouble G_rigid=0; //do not remove =0! … … 5924 5914 5925 5915 /*Add all components to the pSgi or pSgo solution vectors:*/ 5926 values[i]=3*rho_water/rho_earth*area/eartharea*I*(G_rigid+G_elastic); 5927 } 5928 pSgi->SetValues(gsize,indices,values,ADD_VAL); 5929 5930 /*free ressources:*/ 5931 xDelete<IssmDouble>(values); 5932 xDelete<int>(indices); 5916 Sgi[i]+=3*rho_water/rho_earth*area/eartharea*I*(G_rigid+G_elastic); 5917 } 5933 5918 } 5934 5919 … … 5940 5925 } 5941 5926 /*}}}*/ 5942 void Tria::SealevelriseNonEustatic( Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){ /*{{{*/5927 void Tria::SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea){ /*{{{*/ 5943 5928 5944 5929 /*diverse:*/ … … 6046 6031 if(computerigid) G_rigid=xNewZeroInit<IssmDouble>(gsize); 6047 6032 6048 int* indices=xNew<int>(gsize);6049 IssmDouble* values=xNewZeroInit<IssmDouble>(gsize);6050 6033 IssmDouble alpha; 6051 6034 IssmDouble delPhi,delLambda; 6052 6035 6053 6036 for(int i=0;i<gsize;i++){ 6054 6055 indices[i]=i;6056 6037 6057 6038 /*Compute alpha angle between centroid and current vertex : */ … … 6064 6045 if(computerigid){ 6065 6046 G_rigid[i]=1.0/2.0/sin(alpha/2.0); 6066 values[i]+=3*rho_water/rho_earth*area/eartharea*S*G_rigid[i]; 6047 //values[i]+=3*rho_water/rho_earth*area/eartharea*S*G_rigid[i]; 6048 Sgo[i]+=3*rho_water/rho_earth*area/eartharea*S*G_rigid[i]; 6067 6049 } 6068 6050 … … 6071 6053 int index=reCast<int,IssmDouble>(alpha/PI*(M-1)); 6072 6054 G_elastic[i] += G_elastic_precomputed[index]; 6073 values[i]+=3*rho_water/rho_earth*area/eartharea*S*G_elastic[i]; 6074 } 6075 } 6076 6077 pSgo->SetValues(gsize,indices,values,ADD_VAL); 6078 6079 /*free ressources:*/ 6080 xDelete<IssmDouble>(values); 6081 xDelete<int>(indices); 6055 //values[i]+=3*rho_water/rho_earth*area/eartharea*S*G_elastic[i]; 6056 Sgo[i]+=3*rho_water/rho_earth*area/eartharea*S*G_elastic[i]; 6057 } 6058 } 6059 6082 6060 6083 6061 /*Free ressources:*/ … … 6088 6066 } 6089 6067 /*}}}*/ 6090 void Tria::SealevelriseGeodetic( Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz){ /*{{{*/6068 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){ /*{{{*/ 6091 6069 6092 6070 /*diverse:*/ … … 6217 6195 } 6218 6196 6219 int* indices=xNew<int>(gsize);6220 U_values=xNewZeroInit<IssmDouble>(gsize);6197 //int* indices=xNew<int>(gsize); 6198 //U_values=xNewZeroInit<IssmDouble>(gsize); 6221 6199 if(horiz){ 6222 N_values=xNewZeroInit<IssmDouble>(gsize);6223 E_values=xNewZeroInit<IssmDouble>(gsize);6200 //N_values=xNewZeroInit<IssmDouble>(gsize); 6201 //E_values=xNewZeroInit<IssmDouble>(gsize); 6224 6202 } 6225 6203 IssmDouble alpha; … … 6230 6208 for(int i=0;i<gsize;i++){ 6231 6209 6232 indices[i]=i;6210 //indices[i]=i; 6233 6211 6234 6212 /*Compute alpha angle between centroid and current vertex: */ … … 6262 6240 /*Add all components to the pUp solution vectors:*/ 6263 6241 if(IsIceOnlyInElement()){ 6264 U _values[i]+=3*rho_ice/rho_earth*area/eartharea*I*U_elastic[i];6242 Up[i]+=3*rho_ice/rho_earth*area/eartharea*I*U_elastic[i]; 6265 6243 if(horiz){ 6266 N _values[i]+=3*rho_ice/rho_earth*area/eartharea*I*N_elastic[i];6267 E _values[i]+=3*rho_ice/rho_earth*area/eartharea*I*E_elastic[i];6244 North[i]+=3*rho_ice/rho_earth*area/eartharea*I*N_elastic[i]; 6245 East[i]+=3*rho_ice/rho_earth*area/eartharea*I*E_elastic[i]; 6268 6246 } 6269 6247 } 6270 6248 else if(IsOceanInElement()) { 6271 U _values[i]+=3*rho_water/rho_earth*area/eartharea*S*U_elastic[i];6249 Up[i]+=3*rho_water/rho_earth*area/eartharea*S*U_elastic[i]; 6272 6250 if(horiz){ 6273 N _values[i]+=3*rho_water/rho_earth*area/eartharea*S*N_elastic[i];6274 E _values[i]+=3*rho_water/rho_earth*area/eartharea*S*E_elastic[i];6251 North[i]+=3*rho_water/rho_earth*area/eartharea*S*N_elastic[i]; 6252 East[i]+=3*rho_water/rho_earth*area/eartharea*S*E_elastic[i]; 6275 6253 } 6276 6254 } 6277 6255 } 6278 pUp->SetValues(gsize,indices,U_values,ADD_VAL);6279 if(horiz){6280 pNorth->SetValues(gsize,indices,N_values,ADD_VAL);6281 pEast->SetValues(gsize,indices,E_values,ADD_VAL);6282 }6283 6256 6284 6257 /*free ressources:*/ 6285 xDelete<int>(indices);6286 6258 xDelete<IssmDouble>(U_values); 6287 6259 xDelete<IssmDouble>(U_elastic); -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r24790 r24915 166 166 IssmDouble OceanAverage(IssmDouble* Sg); 167 167 void SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old,IssmDouble eartharea); 168 void SealevelriseEustatic( Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea);169 void SealevelriseEustaticIce( Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea);170 void SealevelriseEustaticBottomPressure( Vector<IssmDouble>* pSgi,IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea);171 void SealevelriseNonEustatic( Vector<IssmDouble>* pSgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea);172 void SealevelriseGeodetic( Vector<IssmDouble>* pUp,Vector<IssmDouble>* pNorth,Vector<IssmDouble>* pEast,IssmDouble* Sg,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx,IssmDouble* yy,IssmDouble* zz,IssmDouble eartharea,int horiz);168 void SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea); 169 void SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea); 170 void SealevelriseEustaticBottomPressure(IssmDouble* Sgi, IssmDouble* peustatic,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble oceanarea,IssmDouble eartharea); 171 void SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old,IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble eartharea); 172 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); 173 173 #endif 174 174 /*}}}*/ -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r24861 r24915 4694 4694 IssmDouble eartharea = 0.; 4695 4695 IssmDouble eartharea_cpu = 0.; 4696 int ns,nsmax; 4697 4698 /*Go through elements, and add contribution from each element to the deflection vector wg:*/ 4699 ns = elements->Size(); 4696 IssmDouble* RSLgi = NULL; 4697 int* indices = NULL; 4698 int gsize; 4699 4700 /*Initialize temporary vector that will be used to sum eustatic components on all local elements, prior 4701 * to assembly:*/ 4702 gsize = this->nodes->NumberOfDofs(GsetEnum); 4703 RSLgi=xNewZeroInit<IssmDouble>(gsize); 4704 indices=xNew<int>(gsize); for (int i=0;i<gsize;i++)indices[i]=i; 4700 4705 4701 4706 /*First, figure out the area of the ocean, which is needed to compute the eustatic component: */ 4702 for(int i=0;i< ns;i++){4707 for(int i=0;i<elements->Size();i++){ 4703 4708 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4704 4709 oceanarea_cpu += element->OceanArea(); … … 4712 4717 ISSM_MPI_Bcast(&eartharea,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 4713 4718 4714 /*Figure out max of ns: */4715 ISSM_MPI_Reduce(&ns,&nsmax,1,ISSM_MPI_INT,ISSM_MPI_MAX,0,IssmComm::GetComm());4716 ISSM_MPI_Bcast(&nsmax,1,ISSM_MPI_INT,0,IssmComm::GetComm());4717 4718 4719 /*Call the sea level rise core: */ 4719 for(int i=0;i<nsmax;i++){ 4720 if(i<ns){ 4721 4722 if(VerboseConvergence())if(i%100==0)_printf0_("\r" << " convolution progress: " << (double)i/(double)ns*100 << "% "); 4723 4724 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4725 element->SealevelriseEustatic(pRSLgi,&eustatic_cpu_e,latitude,longitude,radius,oceanarea,eartharea); 4726 eustatic_cpu+=eustatic_cpu_e; 4727 } 4728 if(i%loop==0)pRSLgi->Assemble(); 4729 } 4730 if(VerboseConvergence())_printf0_("\n"); 4731 4732 /*One last time: */ 4720 for(int i=0;i<elements->Size();i++){ 4721 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4722 element->SealevelriseEustatic(RSLgi,&eustatic_cpu_e,latitude,longitude,radius,oceanarea,eartharea); 4723 eustatic_cpu+=eustatic_cpu_e; 4724 } 4725 /*Plug values once and assemble: */ 4726 pRSLgi->SetValues(gsize,indices,RSLgi,ADD_VAL); 4733 4727 pRSLgi->Assemble(); 4734 4728 4735 4729 /*Sum all eustatic components from all cpus:*/ 4736 4730 ISSM_MPI_Reduce (&eustatic_cpu,&eustatic,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); … … 4738 4732 _assert_(!xIsNan<IssmDouble>(eustatic)); 4739 4733 4734 /*Free ressources:*/ 4735 xDelete<int>(indices); 4736 xDelete<IssmDouble>(RSLgi); 4737 4740 4738 /*Assign output pointers:*/ 4741 4739 *peustatic=eustatic; … … 4751 4749 IssmDouble eartharea_cpu=0; 4752 4750 4753 int ns,nsmax; 4751 IssmDouble* RSLgo = NULL; 4752 int* indices = NULL; 4753 int gsize; 4754 4755 /*Initialize temporary vector that will be used to sum eustatic components on all local elements, prior 4756 * to assembly:*/ 4757 gsize = this->nodes->NumberOfDofs(GsetEnum); 4758 RSLgo=xNewZeroInit<IssmDouble>(gsize); 4759 indices=xNew<int>(gsize); for (int i=0;i<gsize;i++)indices[i]=i; 4754 4760 4755 4761 /*Serialize vectors from previous iteration:*/ 4756 4762 RSLg_old=pRSLg_old->ToMPISerial(); 4757 4763 4758 /*Go through elements, and add contribution from each element to the deflection vector wg:*/4759 ns = elements->Size();4760 4761 4764 /*First, figure out the area of the ocean, which is needed to compute the eustatic component: */ 4762 for(int i=0;i< ns;i++){4765 for(int i=0;i<elements->Size();i++){ 4763 4766 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4764 4767 eartharea_cpu += element->GetAreaSpherical(); … … 4768 4771 ISSM_MPI_Bcast(&eartharea,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 4769 4772 4770 /*Figure out max of ns: */4771 ISSM_MPI_Reduce(&ns,&nsmax,1,ISSM_MPI_INT,ISSM_MPI_MAX,0,IssmComm::GetComm());4772 ISSM_MPI_Bcast(&nsmax,1,ISSM_MPI_INT,0,IssmComm::GetComm());4773 4774 4773 /*Call the sea level rise core: */ 4775 for(int i=0;i<nsmax;i++){ 4776 if(i<ns){ 4777 if(verboseconvolution)if(VerboseConvergence())if(i%100==0)_printf0_("\r" << " convolution progress: " << (double)i/(double)ns*100 << "% "); 4778 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4779 element->SealevelriseNonEustatic(pRSLgo,RSLg_old,latitude,longitude,radius,eartharea); 4780 } 4781 if(i%loop==0)pRSLgo->Assemble(); 4782 } 4783 if(verboseconvolution)if(VerboseConvergence())_printf0_("\n"); 4774 for(int i=0;i<elements->Size();i++){ 4775 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4776 element->SealevelriseNonEustatic(RSLgo,RSLg_old,latitude,longitude,radius,eartharea); 4777 } 4778 pRSLgo->SetValues(gsize,indices,RSLgo,ADD_VAL); 4779 pRSLgo->Assemble(); 4784 4780 4785 4781 /*Free ressources:*/ 4782 xDelete<int>(indices); 4783 xDelete<IssmDouble>(RSLgo); 4786 4784 xDelete<IssmDouble>(RSLg_old); 4785 4787 4786 } 4788 4787 /*}}}*/ … … 4881 4880 IssmDouble eartharea_cpu=0; 4882 4881 4883 int ns,nsmax; 4882 IssmDouble* Up = NULL; 4883 IssmDouble* North = NULL; 4884 IssmDouble* East = NULL; 4885 int* indices = NULL; 4886 int gsize; 4887 4884 4888 4885 4889 /*Serialize vectors from previous iteration:*/ 4886 4890 RSLg=pRSLg->ToMPISerial(); 4887 4891 4888 /*Go through elements, and add contribution from each element to the deflection vector wg:*/ 4889 ns = elements->Size(); 4892 /*Initialize temporary vector that will be used to sum eustatic components on all local elements, prior 4893 * to assembly:*/ 4894 gsize = this->nodes->NumberOfDofs(GsetEnum); 4895 Up=xNewZeroInit<IssmDouble>(gsize); 4896 North=xNewZeroInit<IssmDouble>(gsize); 4897 East=xNewZeroInit<IssmDouble>(gsize); 4898 indices=xNew<int>(gsize); for (int i=0;i<gsize;i++)indices[i]=i; 4890 4899 4891 4900 /*First, figure out the area of the ocean, which is needed to compute the eustatic component: */ 4892 for(int i=0;i< ns;i++){4901 for(int i=0;i<elements->Size();i++){ 4893 4902 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4894 4903 eartharea_cpu += element->GetAreaSpherical(); … … 4897 4906 ISSM_MPI_Bcast(&eartharea,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 4898 4907 4899 /*Figure out max of ns: */4900 ISSM_MPI_Reduce(&ns,&nsmax,1,ISSM_MPI_INT,ISSM_MPI_MAX,0,IssmComm::GetComm());4901 ISSM_MPI_Bcast(&nsmax,1,ISSM_MPI_INT,0,IssmComm::GetComm());4902 4903 4908 /*Call the sea level rise core: */ 4904 for(int i=0;i<nsmax;i++){ 4905 if(i<ns){ 4906 if(VerboseConvergence())if(i%100==0)_printf0_("\r" << " convolution progress: " << (double)i/(double)ns*100 << "% "); 4907 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4908 element->SealevelriseGeodetic(pUp,pNorth,pEast,RSLg,latitude,longitude,radius,xx,yy,zz,eartharea,horiz); 4909 } 4910 if(i%loop==0){ 4911 pUp->Assemble(); 4912 if (horiz){ 4913 pNorth->Assemble(); 4914 pEast->Assemble(); 4915 } 4916 } 4917 } 4918 4919 /*One last time: */ 4909 for(int i=0;i<elements->Size();i++){ 4910 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 4911 element->SealevelriseGeodetic(Up,North,East,RSLg,latitude,longitude,radius,xx,yy,zz,eartharea,horiz); 4912 } 4913 4914 pUp->SetValues(gsize,indices,Up,ADD_VAL); 4920 4915 pUp->Assemble(); 4921 if(horiz){ 4916 if (horiz){ 4917 pNorth->SetValues(gsize,indices,North,ADD_VAL); 4922 4918 pNorth->Assemble(); 4919 pEast->SetValues(gsize,indices,East,ADD_VAL); 4923 4920 pEast->Assemble(); 4924 4921 } 4925 if(VerboseConvergence())_printf0_("\n");4926 4922 4927 4923 /*Free ressources:*/ 4924 xDelete<IssmDouble>(Up); 4925 xDelete<IssmDouble>(North); 4926 xDelete<IssmDouble>(East); 4927 xDelete<int>(indices); 4928 4928 xDelete<IssmDouble>(RSLg); 4929 4929 }
Note:
See TracChangeset
for help on using the changeset viewer.