Changeset 22178
- Timestamp:
- 10/20/17 14:03:10 (7 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
r18930 r22178 192 192 193 193 /*Intermediaries*/ 194 IssmDouble dlambda[2],ds[2],D0,omega,Jdet; 194 int n=3; 195 IssmDouble dlambda[2],ds[2],slopex,slopey,slope,omega,Jdet; 195 196 IssmDouble *xyz_list= NULL; 196 197 … … 207 208 element->GradientIndexing(&vertexpidlist[0],control_index); 208 209 Input* adjoint_input = element->GetInput(AdjointEnum); _assert_(adjoint_input); 209 Input* s_input = element->GetInput(SurfaceEnum); _assert_(s_input);210 Input* D0_input = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input);211 210 Input* omega_input = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input); 211 Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input); 212 Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input); 213 Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input); 214 IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum); 212 215 213 216 Gauss* gauss=element->NewGauss(2); … … 218 221 element->NodalFunctionsP1(basis,gauss); 219 222 220 D0_input->GetInputValue(&D0,gauss);221 223 omega_input->GetInputValue(&omega,gauss); 222 224 adjoint_input->GetInputDerivativeValue(&dlambda[0],xyz_list,gauss); 223 s_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss); 225 surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss); 226 surfaceslopex_input->GetInputValue(&slopex,gauss); 227 surfaceslopey_input->GetInputValue(&slopey,gauss); 228 229 slope = sqrt(slopex*slopex + slopey*slopey); 224 230 225 231 /*Build gradient vector (actually -dJ/da): */ 226 232 for(int i=0;i<numvertices;i++){ 227 ge[i]+= -Jdet*gauss->weight*basis[i]* exp(omega)*D0*(ds[0]*dlambda[0] + ds[1]*dlambda[1]);233 ge[i]+= -Jdet*gauss->weight*basis[i]*pow(rhog,n)*exp(omega)*pow(slope,n-1)*(ds[0]*dlambda[0] + ds[1]*dlambda[1]); 228 234 _assert_(!xIsNan<IssmDouble>(ge[i])); 229 235 } -
issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
r20690 r22178 39 39 iomodel->FetchDataToInput(elements,"md.balancethickness.thickening_rate",BalancethicknessThickeningRateEnum); 40 40 iomodel->FetchDataToInput(elements,"md.balancethickness.omega",BalancethicknessOmegaEnum); 41 iomodel->FetchDataToInput(elements,"md.balancethickness.slopex",SurfaceSlopeXEnum); 42 iomodel->FetchDataToInput(elements,"md.balancethickness.slopey",SurfaceSlopeYEnum); 41 43 42 44 /*Update elements: */ … … 63 65 return NULL; 64 66 }/*}}}*/ 65 void Balancethickness2Analysis::CreateD0(Element* element){/*{{{*/66 67 /*Intermediaries */68 IssmDouble Gamma,h,mu0,ds[2],Cmu,B,k,s,b,normds;69 const int n = 3;70 const IssmDouble Hstar = 500.;71 const IssmDouble Lstar = 500.e+3;72 IssmDouble *xyz_list = NULL;73 74 /*Fetch number of vertices and allocate output*/75 int numnodes = element->GetNumberOfNodes();76 IssmDouble* D0 = xNew<IssmDouble>(numnodes);77 78 /*retrieve what we need: */79 element->GetVerticesCoordinates(&xyz_list);80 Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum);81 Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum);82 Input* surface_input = element->GetInput(SurfaceEnum); _assert_(surface_input);83 Input* B_input = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);84 IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);85 86 /*Calculate damage evolution source term: */87 Gauss* gauss=element->NewGauss();88 for (int i=0;i<numnodes;i++){89 gauss->GaussNode(element->GetElementType(),i);90 91 B_input->GetInputValue(&B,gauss);92 if(surfaceslopex_input && surfaceslopey_input){93 surfaceslopex_input->GetInputValue(&ds[0],gauss);94 surfaceslopey_input->GetInputValue(&ds[1],gauss);95 }96 else{97 surface_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);98 }99 100 /*check slopes*/101 normds = sqrt(ds[0]*ds[0]+ds[1]*ds[1]);102 if (normds==0.){103 _error_("surface slope is zero");104 }105 if(normds<1.e-5){106 ds[0] = ds[0]/normds*1.e+5;107 ds[1] = ds[1]/normds*1.e+5;108 normds = 1.e-5;109 }110 111 mu0 = pow(2.,(1-3*n)/(2.*n)) * B;112 Gamma = pow(rhog,n) * pow(Hstar,2*(n+1)) * pow(Hstar/Lstar,2*(n+1)) * 1./pow(mu0,n);113 114 D0[i] = Gamma*pow(ds[0]*ds[0]+ds[1]*ds[1],(n-1)/2)/(n+2);115 }116 117 /*Add input*/118 element->AddInput(BalancethicknessD0Enum,D0,element->GetElementType());119 //if(surfaceslopex_input && surfaceslopey_input){120 // element->DeleteInput(SurfaceSlopeXEnum);121 // element->DeleteInput(SurfaceSlopeYEnum);122 //}123 124 /*Clean up and return*/125 xDelete<IssmDouble>(D0);126 xDelete<IssmDouble>(xyz_list);127 delete gauss;128 }/*}}}*/129 67 ElementMatrix* Balancethickness2Analysis::CreateJacobianMatrix(Element* element){/*{{{*/ 130 68 _error_("Not implemented"); … … 133 71 134 72 /*Intermediaries */ 135 IssmDouble Jdet,D0,omega; 73 int n=3; 74 IssmDouble Jdet,omega,ds[2],slope; 136 75 IssmDouble* xyz_list = NULL; 137 76 … … 145 84 /*Retrieve all inputs and parameters*/ 146 85 element->GetVerticesCoordinates(&xyz_list); 147 Input* omega_input = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input); 148 Input* D0_input = element->GetInput(BalancethicknessD0Enum); 149 if(!D0_input){ 150 this->CreateD0(element); 151 D0_input = element->GetInput(BalancethicknessD0Enum); _assert_(D0_input); 152 } 86 Input* omega_input = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input); 87 Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input); 88 Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input); 89 IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum); 153 90 154 91 /* Start looping on the number of gaussian points: */ … … 158 95 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 159 96 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 160 D0_input->GetInputValue(&D0,gauss);161 97 omega_input->GetInputValue(&omega,gauss); 98 surfaceslopex_input->GetInputValue(&ds[0],gauss); 99 surfaceslopey_input->GetInputValue(&ds[1],gauss); 100 101 slope = sqrt(ds[0]*ds[0] + ds[1]*ds[1]); 162 102 163 103 for(int i=0;i<numnodes;i++){ 164 104 for(int j=0;j<numnodes;j++){ 165 Ke->values[i*numnodes+j] += D0*exp(omega)*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]);105 Ke->values[i*numnodes+j] += pow(rhog,n)*exp(omega)*pow(slope,n-1)*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]); 166 106 } 167 107 } -
issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.h
r18930 r22178 23 23 void Core(FemModel* femmodel); 24 24 ElementVector* CreateDVector(Element* element); 25 void CreateD0(Element* element);26 25 ElementMatrix* CreateJacobianMatrix(Element* element); 27 26 ElementMatrix* CreateKMatrix(Element* element); -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r22124 r22178 1759 1759 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1760 1760 this->inputs->AddInput(new ControlInput(ThicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1761 } 1762 break; 1763 case BalancethicknessOmegaEnum: 1764 if(iomodel->Data("md.balancethickness.omega")){ 1765 for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.balancethickness.omega")[tria_vertex_ids[j]-1]; 1766 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1767 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1768 this->inputs->AddInput(new ControlInput(BalancethicknessOmegaEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1761 1769 } 1762 1770 break; -
issm/trunk-jpl/src/c/cores/adjointbalancethickness2_core.cpp
r18193 r22178 24 24 25 25 /*Call SurfaceAreax, because some it might be needed by PVector*/ 26 SurfaceAreax(NULL,femmodel);26 //SurfaceAreax(NULL,femmodel); 27 27 28 28 /*compute adjoint*/ -
issm/trunk-jpl/src/c/cores/balancethickness2_core.cpp
r18715 r22178 13 13 14 14 /*parameters: */ 15 bool 16 IssmDouble l = 3.;15 bool save_results; 16 //IssmDouble l = 3.; 17 17 18 18 /*recover parameters: */ 19 19 femmodel->parameters->FindParam(&save_results,SaveResultsEnum); 20 20 21 if(VerboseSolution()) _printf0_("computing smooth surface slopes:\n");21 //if(VerboseSolution()) _printf0_("computing smooth surface slopes:\n"); 22 22 //femmodel->parameters->SetParam(l,SmoothThicknessMultiplierEnum); 23 23 //femmodel->SetCurrentConfiguration(SmoothAnalysisEnum); … … 26 26 //femmodel->parameters->SetParam(SurfaceSlopeYEnum,InputToSmoothEnum); 27 27 //solutionsequence_linear(femmodel); 28 surfaceslope_core(femmodel);28 //surfaceslope_core(femmodel); 29 29 30 30 if(VerboseSolution()) _printf0_("call computational core:\n"); … … 35 35 if(save_results){ 36 36 if(VerboseSolution()) _printf0_(" saving results\n"); 37 const int numoutputs = 6; 38 int outputs[numoutputs] = {SurfaceEnum,SurfaceSlopeXEnum,SurfaceSlopeYEnum,VxEnum,VyEnum,VelEnum}; 39 //const int numoutputs = 4; 40 //int outputs[numoutputs] = {SurfaceEnum,VxEnum,VyEnum,VelEnum}; 37 const int numoutputs = 1; 38 int outputs[numoutputs] = {SurfaceEnum}; 41 39 femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],numoutputs); 42 40 } -
issm/trunk-jpl/src/c/cores/controlvalidation_core.cpp
r19344 r22178 104 104 xDelete<IssmDouble>(X); 105 105 xDelete<IssmDouble>(X0); 106 xDelete<IssmDouble>(scaling_factors); 106 107 }
Note:
See TracChangeset
for help on using the changeset viewer.