 |
Ice Sheet System Model
4.18
Code documentation
|
#include <AdjointHorizAnalysis.h>
|
void | CreateConstraints (Constraints *constraints, IoModel *iomodel) |
|
void | CreateLoads (Loads *loads, IoModel *iomodel) |
|
void | CreateNodes (Nodes *nodes, IoModel *iomodel, bool isamr=false) |
|
int | DofsPerNode (int **doflist, int domaintype, int approximation) |
|
void | UpdateElements (Elements *elements, Inputs2 *inputs2, IoModel *iomodel, int analysis_counter, int analysis_type) |
|
void | UpdateParameters (Parameters *parameters, IoModel *iomodel, int solution_enum, int analysis_enum) |
|
void | Core (FemModel *femmodel) |
|
ElementVector * | CreateDVector (Element *element) |
|
ElementMatrix * | CreateJacobianMatrix (Element *element) |
|
ElementMatrix * | CreateKMatrix (Element *element) |
|
ElementMatrix * | CreateKMatrixFS (Element *element) |
|
ElementMatrix * | CreateKMatrixHO (Element *element) |
|
ElementMatrix * | CreateKMatrixL1L2 (Element *element) |
|
ElementMatrix * | CreateKMatrixSSA (Element *element) |
|
ElementVector * | CreatePVector (Element *element) |
|
ElementVector * | CreatePVectorFS (Element *element) |
|
ElementVector * | CreatePVectorL1L2 (Element *element) |
|
ElementVector * | CreatePVectorHO (Element *element) |
|
ElementVector * | CreatePVectorSSA (Element *element) |
|
void | GetSolutionFromInputs (Vector< IssmDouble > *solution, Element *element) |
|
void | GradientJ (Vector< IssmDouble > *gradient, Element *element, int control_type, int control_index) |
|
void | GradientJBbarFS (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJBbarGradient (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJBinitial (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJBbarL1L2 (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJBbarHO (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJBbarSSA (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJBFS (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJBGradient (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJBHO (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJBSSA (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJDragFS (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJDragGradient (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJDragL1L2 (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJDragHO (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJDragSSA (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJDragHydroFS (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJDragHydroL1L2 (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJDragHydroHO (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJDragHydroSSA (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | GradientJDSSA (Element *element, Vector< IssmDouble > *gradient, int control_index) |
|
void | InputUpdateFromSolution (IssmDouble *solution, Element *element) |
|
void | InputUpdateFromSolutionFS (IssmDouble *solution, Element *element) |
|
void | InputUpdateFromSolutionHoriz (IssmDouble *solution, Element *element) |
|
void | UpdateConstraints (FemModel *femmodel) |
|
virtual | ~Analysis () |
|
Definition at line 11 of file AdjointHorizAnalysis.h.
◆ CreateConstraints()
void AdjointHorizAnalysis::CreateConstraints |
( |
Constraints * |
constraints, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateLoads()
void AdjointHorizAnalysis::CreateLoads |
( |
Loads * |
loads, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateNodes()
void AdjointHorizAnalysis::CreateNodes |
( |
Nodes * |
nodes, |
|
|
IoModel * |
iomodel, |
|
|
bool |
isamr = false |
|
) |
| |
|
virtual |
◆ DofsPerNode()
int AdjointHorizAnalysis::DofsPerNode |
( |
int ** |
doflist, |
|
|
int |
domaintype, |
|
|
int |
approximation |
|
) |
| |
|
virtual |
◆ UpdateElements()
void AdjointHorizAnalysis::UpdateElements |
( |
Elements * |
elements, |
|
|
Inputs2 * |
inputs2, |
|
|
IoModel * |
iomodel, |
|
|
int |
analysis_counter, |
|
|
int |
analysis_type |
|
) |
| |
|
virtual |
◆ UpdateParameters()
void AdjointHorizAnalysis::UpdateParameters |
( |
Parameters * |
parameters, |
|
|
IoModel * |
iomodel, |
|
|
int |
solution_enum, |
|
|
int |
analysis_enum |
|
) |
| |
|
virtual |
◆ Core()
void AdjointHorizAnalysis::Core |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
◆ CreateDVector()
◆ CreateJacobianMatrix()
◆ CreateKMatrix()
◆ CreateKMatrixFS()
Definition at line 57 of file AdjointHorizAnalysis.cpp.
63 bool incomplete_adjoint;
66 IssmDouble eps1dotdphii,eps1dotdphij,eps2dotdphii,eps2dotdphij,eps3dotdphii,eps3dotdphij;
72 if(dim==2) epssize = 3;
78 int numdof = vnumnodes*dim + pnumnodes;
85 if(incomplete_adjoint)
return Ke;
100 IssmDouble* dbasis = xNew<IssmDouble>(dim*vnumnodes);
104 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
110 element->
StrainRateHO(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
112 eps1[0]=epsilon[0]; eps2[0]=epsilon[2]; eps3[0]=epsilon[3];
113 eps1[1]=epsilon[2]; eps2[1]=epsilon[1]; eps3[1]=epsilon[4];
114 eps1[2]=epsilon[3]; eps2[2]=epsilon[4]; eps3[2]= -epsilon[0] -epsilon[1];
116 for(
int i=0;i<vnumnodes;i++){
117 for(
int j=0;j<vnumnodes;j++){
118 eps1dotdphii=eps1[0]*dbasis[0*vnumnodes+i]+eps1[1]*dbasis[1*vnumnodes+i]+eps1[2]*dbasis[2*vnumnodes+i];
119 eps1dotdphij=eps1[0]*dbasis[0*vnumnodes+j]+eps1[1]*dbasis[1*vnumnodes+j]+eps1[2]*dbasis[2*vnumnodes+j];
120 eps2dotdphii=eps2[0]*dbasis[0*vnumnodes+i]+eps2[1]*dbasis[1*vnumnodes+i]+eps2[2]*dbasis[2*vnumnodes+i];
121 eps2dotdphij=eps2[0]*dbasis[0*vnumnodes+j]+eps2[1]*dbasis[1*vnumnodes+j]+eps2[2]*dbasis[2*vnumnodes+j];
122 eps3dotdphii=eps3[0]*dbasis[0*vnumnodes+i]+eps3[1]*dbasis[1*vnumnodes+i]+eps3[2]*dbasis[2*vnumnodes+i];
123 eps3dotdphij=eps3[0]*dbasis[0*vnumnodes+j]+eps3[1]*dbasis[1*vnumnodes+j]+eps3[2]*dbasis[2*vnumnodes+j];
125 Ke->
values[numdof*(4*i+0)+4*j+0]+=gauss->
weight*Jdet*2*mu_prime*eps1dotdphij*eps1dotdphii;
126 Ke->
values[numdof*(4*i+0)+4*j+1]+=gauss->
weight*Jdet*2*mu_prime*eps2dotdphij*eps1dotdphii;
127 Ke->
values[numdof*(4*i+0)+4*j+2]+=gauss->
weight*Jdet*2*mu_prime*eps3dotdphij*eps1dotdphii;
129 Ke->
values[numdof*(4*i+1)+4*j+0]+=gauss->
weight*Jdet*2*mu_prime*eps1dotdphij*eps2dotdphii;
130 Ke->
values[numdof*(4*i+1)+4*j+1]+=gauss->
weight*Jdet*2*mu_prime*eps2dotdphij*eps2dotdphii;
131 Ke->
values[numdof*(4*i+1)+4*j+2]+=gauss->
weight*Jdet*2*mu_prime*eps3dotdphij*eps2dotdphii;
133 Ke->
values[numdof*(4*i+2)+4*j+0]+=gauss->
weight*Jdet*2*mu_prime*eps1dotdphij*eps3dotdphii;
134 Ke->
values[numdof*(4*i+2)+4*j+1]+=gauss->
weight*Jdet*2*mu_prime*eps2dotdphij*eps3dotdphii;
135 Ke->
values[numdof*(4*i+2)+4*j+2]+=gauss->
weight*Jdet*2*mu_prime*eps3dotdphij*eps3dotdphii;
145 xDelete<IssmDouble>(dbasis);
146 xDelete<IssmDouble>(xyz_list);
◆ CreateKMatrixHO()
Definition at line 149 of file AdjointHorizAnalysis.cpp.
155 bool incomplete_adjoint;
157 IssmDouble eps1dotdphii,eps1dotdphij,eps2dotdphii,eps2dotdphij;
169 if(incomplete_adjoint)
return Ke;
177 IssmDouble* dbasis = xNew<IssmDouble>(3*numnodes);
181 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
187 element->
StrainRateHO(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
189 eps1[0]=2.*epsilon[0]+epsilon[1]; eps2[0]=epsilon[2];
190 eps1[1]=epsilon[2]; eps2[1]=epsilon[0]+2.*epsilon[1];
191 eps1[2]=epsilon[3]; eps2[2]=epsilon[4];
193 for(
int i=0;i<numnodes;i++){
194 for(
int j=0;j<numnodes;j++){
195 eps1dotdphii=eps1[0]*dbasis[0*numnodes+i]+eps1[1]*dbasis[1*numnodes+i]+eps1[2]*dbasis[2*numnodes+i];
196 eps1dotdphij=eps1[0]*dbasis[0*numnodes+j]+eps1[1]*dbasis[1*numnodes+j]+eps1[2]*dbasis[2*numnodes+j];
197 eps2dotdphii=eps2[0]*dbasis[0*numnodes+i]+eps2[1]*dbasis[1*numnodes+i]+eps2[2]*dbasis[2*numnodes+i];
198 eps2dotdphij=eps2[0]*dbasis[0*numnodes+j]+eps2[1]*dbasis[1*numnodes+j]+eps2[2]*dbasis[2*numnodes+j];
200 Ke->
values[2*numnodes*(2*i+0)+2*j+0]+=gauss->
weight*Jdet*2*mu_prime*eps1dotdphij*eps1dotdphii;
201 Ke->
values[2*numnodes*(2*i+0)+2*j+1]+=gauss->
weight*Jdet*2*mu_prime*eps2dotdphij*eps1dotdphii;
202 Ke->
values[2*numnodes*(2*i+1)+2*j+0]+=gauss->
weight*Jdet*2*mu_prime*eps1dotdphij*eps2dotdphii;
203 Ke->
values[2*numnodes*(2*i+1)+2*j+1]+=gauss->
weight*Jdet*2*mu_prime*eps2dotdphij*eps2dotdphii;
213 xDelete<IssmDouble>(dbasis);
214 xDelete<IssmDouble>(xyz_list);
◆ CreateKMatrixL1L2()
Definition at line 217 of file AdjointHorizAnalysis.cpp.
220 bool incomplete_adjoint;
229 if(!incomplete_adjoint){
230 _error_(
"Exact adjoint not supported yet for L1L2 model");
◆ CreateKMatrixSSA()
Definition at line 234 of file AdjointHorizAnalysis.cpp.
247 basalelement = element;
250 if(!element->
IsOnBase())
return NULL;
257 bool incomplete_adjoint;
259 IssmDouble eps1dotdphii,eps1dotdphij,eps2dotdphii,eps2dotdphij;
271 if(incomplete_adjoint){
283 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes);
287 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
294 basalelement->
StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input);
296 eps1[0]=2.*epsilon[0]+epsilon[1]; eps2[0]=epsilon[2];
297 eps1[1]=epsilon[2]; eps2[1]=epsilon[0]+2*epsilon[1];
299 for(
int i=0;i<numnodes;i++){
300 for(
int j=0;j<numnodes;j++){
301 eps1dotdphii=eps1[0]*dbasis[0*numnodes+i]+eps1[1]*dbasis[1*numnodes+i];
302 eps1dotdphij=eps1[0]*dbasis[0*numnodes+j]+eps1[1]*dbasis[1*numnodes+j];
303 eps2dotdphii=eps2[0]*dbasis[0*numnodes+i]+eps2[1]*dbasis[1*numnodes+i];
304 eps2dotdphij=eps2[0]*dbasis[0*numnodes+j]+eps2[1]*dbasis[1*numnodes+j];
306 Ke->
values[2*numnodes*(2*i+0)+2*j+0]+=gauss->
weight*Jdet*2*mu_prime*thickness*eps1dotdphij*eps1dotdphii;
307 Ke->
values[2*numnodes*(2*i+0)+2*j+1]+=gauss->
weight*Jdet*2*mu_prime*thickness*eps2dotdphij*eps1dotdphii;
308 Ke->
values[2*numnodes*(2*i+1)+2*j+0]+=gauss->
weight*Jdet*2*mu_prime*thickness*eps1dotdphij*eps2dotdphii;
309 Ke->
values[2*numnodes*(2*i+1)+2*j+1]+=gauss->
weight*Jdet*2*mu_prime*thickness*eps2dotdphij*eps2dotdphii;
319 xDelete<IssmDouble>(dbasis);
320 xDelete<IssmDouble>(xyz_list);
◆ CreatePVector()
◆ CreatePVectorFS()
Definition at line 343 of file AdjointHorizAnalysis.cpp.
349 int num_responses,i,domaintype;
350 IssmDouble Jdet,obs_velocity_mag,velocity_mag;
353 int *responses = NULL;
364 int* cs_list = xNew<int>(vnumnodes+pnumnodes);
366 else for(i=0;i<vnumnodes;i++) cs_list[i] =
XYZEnum;
367 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] =
PressureEnum;
371 IssmDouble* vbasis = xNew<IssmDouble>(vnumnodes);
381 Input2* vyobs_input = NULL;
391 for(
int resp=0;resp<num_responses;resp++){
399 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
413 for(
int resp=0;resp<num_responses;resp++){
416 switch(responses[resp]){
427 for(i=0;i<vnumnodes;i++){
430 pe->
values[i*3+0]+=dux*weight*Jdet*gauss->
weight*vbasis[i];
432 pe->
values[i*3+1]+=duy*weight*Jdet*gauss->
weight*vbasis[i];
436 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*vbasis[i];
452 for(i=0;i<vnumnodes;i++){
454 scalex=pow(meanvel/(vxobs+epsvel),2);
if(vxobs==0)scalex=0;
455 scaley=pow(meanvel/(vyobs+epsvel),2);
if(vyobs==0)scaley=0;
456 dux=scalex*(vxobs-vx);
457 duy=scaley*(vyobs-vy);
458 pe->
values[i*3+0]+=dux*weight*Jdet*gauss->
weight*vbasis[i];
459 pe->
values[i*3+1]+=duy*weight*Jdet*gauss->
weight*vbasis[i];
462 scalex=pow(meanvel/(vxobs+epsvel),2);
if(vxobs==0)scalex=0;
463 dux=scalex*(vxobs-vx);
464 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*vbasis[i];
465 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*vbasis[i];
481 for(i=0;i<vnumnodes;i++){
483 velocity_mag =sqrt(vx*vx+vy*vy)+epsvel;
484 obs_velocity_mag=sqrt(vxobs*vxobs+vyobs*vyobs)+epsvel;
485 scale=-8.*meanvel*meanvel/(velocity_mag*velocity_mag)*log(velocity_mag/obs_velocity_mag);
488 pe->
values[i*3+0]+=dux*weight*Jdet*gauss->
weight*vbasis[i];
489 pe->
values[i*3+1]+=duy*weight*Jdet*gauss->
weight*vbasis[i];
492 velocity_mag =fabs(vx)+epsvel;
493 obs_velocity_mag=fabs(vxobs)+epsvel;
494 scale=-8.*meanvel*meanvel/(velocity_mag*velocity_mag)*log(velocity_mag/obs_velocity_mag);
496 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*vbasis[i];
511 for(i=0;i<vnumnodes;i++){
513 scale=1./(S*2*sqrt(pow(vx-vxobs,2)+pow(vy-vyobs,2))+epsvel);
514 dux=scale*(vxobs-vx);
515 duy=scale*(vyobs-vy);
516 pe->
values[i*3+0]+=dux*weight*Jdet*gauss->
weight*vbasis[i];
517 pe->
values[i*3+1]+=duy*weight*Jdet*gauss->
weight*vbasis[i];
520 scale=1./(S*2*fabs(vx-vxobs)+epsvel);
521 dux=scale*(vxobs-vx);
522 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*vbasis[i];
536 for(i=0;i<vnumnodes;i++){
538 dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
539 duy = - meanvel*meanvel * log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)) / (vy+epsvel);
540 pe->
values[i*3+0]+=dux*weight*Jdet*gauss->
weight*vbasis[i];
541 pe->
values[i*3+1]+=duy*weight*Jdet*gauss->
weight*vbasis[i];
544 dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
545 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*vbasis[i];
577 xDelete<int>(cs_list);
578 xDelete<int>(responses);
579 xDelete<IssmDouble>(xyz_list_top);
580 xDelete<IssmDouble>(vbasis);
◆ CreatePVectorL1L2()
◆ CreatePVectorHO()
Definition at line 589 of file AdjointHorizAnalysis.cpp.
595 int num_responses,i,domaintype;
596 IssmDouble Jdet,obs_velocity_mag,velocity_mag;
599 int *responses = NULL;
610 IssmDouble* basis = xNew<IssmDouble>(numnodes);
630 for(
int resp=0;resp<num_responses;resp++){
638 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
651 for(
int resp=0;resp<num_responses;resp++){
654 switch(responses[resp]){
665 for(i=0;i<numnodes;i++){
669 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*basis[i];
670 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*basis[i];
690 for(i=0;i<numnodes;i++){
692 scalex=pow(meanvel/(vxobs+epsvel),2);
if(vxobs==0)scalex=0;
693 scaley=pow(meanvel/(vyobs+epsvel),2);
if(vyobs==0)scaley=0;
694 dux=scalex*(vxobs-vx);
695 duy=scaley*(vyobs-vy);
696 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*basis[i];
697 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*basis[i];
700 scalex=pow(meanvel/(vxobs+epsvel),2);
if(vxobs==0)scalex=0;
701 dux=scalex*(vxobs-vx);
718 for(i=0;i<numnodes;i++){
720 velocity_mag =sqrt(pow(vx, 2)+pow(vy, 2))+epsvel;
721 obs_velocity_mag=sqrt(pow(vxobs,2)+pow(vyobs,2))+epsvel;
722 scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
725 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*basis[i];
726 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*basis[i];
729 velocity_mag =fabs(vx)+epsvel;
730 obs_velocity_mag=fabs(vxobs)+epsvel;
731 scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
748 for(i=0;i<numnodes;i++){
750 scale=1./(S*2*sqrt(pow(vx-vxobs,2)+pow(vy-vyobs,2))+epsvel);
751 dux=scale*(vxobs-vx);
752 duy=scale*(vyobs-vy);
753 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*basis[i];
754 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*basis[i];
757 scale=1./(S*2*fabs(vx-vxobs)+epsvel);
758 dux=scale*(vxobs-vx);
773 for(i=0;i<numnodes;i++){
775 dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
776 duy = - meanvel*meanvel * log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)) / (vy+epsvel);
777 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*basis[i];
778 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*basis[i];
781 dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
817 xDelete<int>(responses);
818 xDelete<IssmDouble>(xyz_list_top);
819 xDelete<IssmDouble>(basis);
◆ CreatePVectorSSA()
Definition at line 824 of file AdjointHorizAnalysis.cpp.
837 basalelement = element;
840 if(!element->
IsOnBase())
return NULL;
844 if(!element->
IsOnBase())
return NULL;
852 IssmDouble Jdet,obs_velocity_mag,velocity_mag;
855 int *responses = NULL;
863 IssmDouble* basis = xNew<IssmDouble>(numnodes);
883 for(
int resp=0;resp<num_responses;resp++){
891 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
904 for(
int resp=0;resp<num_responses;resp++){
907 switch(responses[resp]){
918 for(i=0;i<numnodes;i++){
922 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*basis[i];
923 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*basis[i];
943 for(i=0;i<numnodes;i++){
945 scalex=pow(meanvel/(vxobs+epsvel),2);
if(vxobs==0)scalex=0;
946 scaley=pow(meanvel/(vyobs+epsvel),2);
if(vyobs==0)scaley=0;
947 dux=scalex*(vxobs-vx);
948 duy=scaley*(vyobs-vy);
949 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*basis[i];
950 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*basis[i];
953 scalex=pow(meanvel/(vxobs+epsvel),2);
if(vxobs==0)scalex=0;
954 dux=scalex*(vxobs-vx);
971 for(i=0;i<numnodes;i++){
973 velocity_mag =sqrt(pow(vx, 2)+pow(vy, 2))+epsvel;
974 obs_velocity_mag=sqrt(pow(vxobs,2)+pow(vyobs,2))+epsvel;
975 scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
978 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*basis[i];
979 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*basis[i];
982 velocity_mag =fabs(vx)+epsvel;
983 obs_velocity_mag=fabs(vxobs)+epsvel;
984 scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
1001 for(i=0;i<numnodes;i++){
1003 scale=1./(S*2*sqrt(pow(vx-vxobs,2)+pow(vy-vyobs,2))+epsvel);
1004 dux=scale*(vxobs-vx);
1005 duy=scale*(vyobs-vy);
1006 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*basis[i];
1007 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*basis[i];
1010 scale=1./(S*2*fabs(vx-vxobs)+epsvel);
1011 dux=scale*(vxobs-vx);
1026 for(i=0;i<numnodes;i++){
1028 dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
1029 duy = - meanvel*meanvel * log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)) / (vy+epsvel);
1030 pe->
values[i*2+0]+=dux*weight*Jdet*gauss->
weight*basis[i];
1031 pe->
values[i*2+1]+=duy*weight*Jdet*gauss->
weight*basis[i];
1034 dux = - meanvel*meanvel * log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)) / (vx+epsvel);
1070 xDelete<int>(responses);
1071 xDelete<IssmDouble>(xyz_list);
1072 xDelete<IssmDouble>(basis);
◆ GetSolutionFromInputs()
◆ GradientJ()
void AdjointHorizAnalysis::GradientJ |
( |
Vector< IssmDouble > * |
gradient, |
|
|
Element * |
element, |
|
|
int |
control_type, |
|
|
int |
control_index |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 1080 of file AdjointHorizAnalysis.cpp.
1097 int *responses = NULL;
1098 int num_responses,resp;
1112 for(resp=0;resp<num_responses;resp++)
switch(responses[resp]){
1126 switch(control_type){
1128 switch(approximation){
1138 switch(approximation){
1148 switch(approximation){
1158 switch(approximation){
1167 switch(approximation){
1177 xDelete<int>(responses);
◆ GradientJBbarFS()
void AdjointHorizAnalysis::GradientJBbarFS |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
◆ GradientJBbarGradient()
void AdjointHorizAnalysis::GradientJBbarGradient |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 1184 of file AdjointHorizAnalysis.cpp.
1194 basalelement = element;
1216 IssmDouble* dbasis = xNew<IssmDouble>(2*numvertices);
1217 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
1218 int* vertexpidlist = xNew<int>(numvertices);
1228 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1239 for(
int i=0;i<numvertices;i++){
1241 ge[i]+=-weight*Jdet*gauss->
weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]);
1244 ge[i]+=-weight*Jdet*gauss->
weight*dbasis[0*numvertices+i]*dk[0];
1246 _assert_(!xIsNan<IssmDouble>(ge[i]));
1252 xDelete<IssmDouble>(xyz_list);
1253 xDelete<IssmDouble>(dbasis);
1254 xDelete<IssmDouble>(ge);
1255 xDelete<int>(vertexpidlist);
◆ GradientJBinitial()
void AdjointHorizAnalysis::GradientJBinitial |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 1423 of file AdjointHorizAnalysis.cpp.
1449 IssmDouble* basis = xNew<IssmDouble>(numvertices);
1450 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
1451 int* vertexpidlist = xNew<int>(numvertices);
1462 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1473 for(
int i=0;i<numvertices;i++){
1474 ge[i]+=-weight*Jdet*gauss->
weight*basis[i]*(B-B0);
1475 _assert_(!xIsNan<IssmDouble>(ge[i]));
1481 xDelete<IssmDouble>(xyz_list);
1482 xDelete<IssmDouble>(basis);
1483 xDelete<IssmDouble>(ge);
1484 xDelete<int>(vertexpidlist);
◆ GradientJBbarL1L2()
void AdjointHorizAnalysis::GradientJBbarL1L2 |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
◆ GradientJBbarHO()
void AdjointHorizAnalysis::GradientJBbarHO |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
◆ GradientJBbarSSA()
void AdjointHorizAnalysis::GradientJBbarSSA |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 1269 of file AdjointHorizAnalysis.cpp.
1279 basalelement = element;
1305 IssmDouble* basis = xNew<IssmDouble>(numvertices);
1306 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
1307 int* vertexpidlist = xNew<int>(numvertices);
1321 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1330 basalelement->
dViscositydBSSA(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
1336 for(
int i=0;i<numvertices;i++){
1337 ge[i]+=-dmudB*thickness*(
1338 (2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
1339 )*Jdet*gauss->
weight*basis[i];
1340 _assert_(!xIsNan<IssmDouble>(ge[i]));
1346 xDelete<IssmDouble>(xyz_list);
1347 xDelete<IssmDouble>(basis);
1348 xDelete<IssmDouble>(ge);
1349 xDelete<int>(vertexpidlist);
◆ GradientJBFS()
◆ GradientJBGradient()
void AdjointHorizAnalysis::GradientJBGradient |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 1357 of file AdjointHorizAnalysis.cpp.
1383 IssmDouble* dbasis = xNew<IssmDouble>(3*numvertices);
1384 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
1385 int* vertexpidlist = xNew<int>(numvertices);
1394 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1404 for(
int i=0;i<numvertices;i++){
1406 ge[i]+=-weight*Jdet*gauss->
weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]);
1409 ge[i]+=-weight*Jdet*gauss->
weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]+dbasis[2*numvertices+i]*dk[2]);
1411 _assert_(!xIsNan<IssmDouble>(ge[i]));
1417 xDelete<IssmDouble>(xyz_list);
1418 xDelete<IssmDouble>(dbasis);
1419 xDelete<IssmDouble>(ge);
1420 xDelete<int>(vertexpidlist);
◆ GradientJBHO()
Definition at line 1487 of file AdjointHorizAnalysis.cpp.
1504 IssmDouble* basis = xNew<IssmDouble>(numvertices);
1505 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
1506 int* vertexpidlist = xNew<int>(numvertices);
1515 Input2* adjointy_input = NULL;
1523 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1536 element->
dViscositydBHO(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
1542 for(
int i=0;i<numvertices;i++){
1544 ge[i]+=-dmudB*thickness*(
1545 (2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
1546 )*Jdet*gauss->
weight*basis[i];
1549 ge[i]+=-dmudB*thickness*4*dvx[0]*dadjx[0]*Jdet*gauss->
weight*basis[i];
1551 _assert_(!xIsNan<IssmDouble>(ge[i]));
1557 xDelete<IssmDouble>(xyz_list);
1558 xDelete<IssmDouble>(basis);
1559 xDelete<IssmDouble>(ge);
1560 xDelete<int>(vertexpidlist);
◆ GradientJBSSA()
Definition at line 1563 of file AdjointHorizAnalysis.cpp.
1573 basalelement = element;
1599 IssmDouble* basis = xNew<IssmDouble>(numvertices);
1600 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
1601 int* vertexpidlist = xNew<int>(numvertices);
1615 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1624 basalelement->
dViscositydBSSA(&dmudB,dim,xyz_list,gauss,vx_input,vy_input);
1630 for(
int i=0;i<numvertices;i++){
1631 ge[i]+=-dmudB*thickness*(
1632 (2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
1633 )*Jdet*gauss->
weight*basis[i];
1634 _assert_(!xIsNan<IssmDouble>(ge[i]));
1640 xDelete<IssmDouble>(xyz_list);
1641 xDelete<IssmDouble>(basis);
1642 xDelete<IssmDouble>(ge);
1643 xDelete<int>(vertexpidlist);
◆ GradientJDragFS()
void AdjointHorizAnalysis::GradientJDragFS |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 1729 of file AdjointHorizAnalysis.cpp.
1746 IssmDouble* basis = xNew<IssmDouble>(numvertices);
1747 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
1748 int* vertexpidlist = xNew<int>(numvertices);
1766 Input2* adjointz_input = NULL;
1775 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1789 element->
NormalBase(&normal[0],xyz_list_base);
1796 for(
int i=0;i<numvertices;i++){
1798 -lambda*(2*drag*dalpha2dk*(vx - vz*normal[0]*normal[2]))
1799 -mu *(2*drag*dalpha2dk*(vy - vz*normal[1]*normal[2]))
1800 -xi *(2*drag*dalpha2dk*(-vx*normal[0]*normal[2]-vy*normal[1]*normal[2]))
1801 )*Jdet*gauss->
weight*basis[i];
1802 _assert_(!xIsNan<IssmDouble>(ge[i]));
1806 for(
int i=0;i<numvertices;i++){
1808 -lambda*2*drag*dalpha2dk*vx
1809 -mu *2*drag*dalpha2dk*vy
1810 )*Jdet*gauss->
weight*basis[i];
1811 _assert_(!xIsNan<IssmDouble>(ge[i]));
1818 xDelete<IssmDouble>(xyz_list_base);
1819 xDelete<IssmDouble>(basis);
1820 xDelete<IssmDouble>(ge);
1821 xDelete<int>(vertexpidlist);
◆ GradientJDragGradient()
void AdjointHorizAnalysis::GradientJDragGradient |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 1647 of file AdjointHorizAnalysis.cpp.
1660 basalelement = element;
1685 IssmDouble* dbasis = xNew<IssmDouble>(2*numvertices);
1686 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
1687 int* vertexpidlist = xNew<int>(numvertices);
1697 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1708 for(
int i=0;i<numvertices;i++){
1710 ge[i]+=-weight*Jdet*gauss->
weight*(dbasis[0*numvertices+i]*dk[0]+dbasis[1*numvertices+i]*dk[1]);
1713 ge[i]+=-weight*Jdet*gauss->
weight*dbasis[0*numvertices+i]*dk[0];
1715 _assert_(!xIsNan<IssmDouble>(ge[i]));
1721 xDelete<IssmDouble>(xyz_list);
1722 xDelete<IssmDouble>(dbasis);
1723 xDelete<IssmDouble>(ge);
1724 xDelete<int>(vertexpidlist);
◆ GradientJDragL1L2()
void AdjointHorizAnalysis::GradientJDragL1L2 |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
◆ GradientJDragHO()
void AdjointHorizAnalysis::GradientJDragHO |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 1830 of file AdjointHorizAnalysis.cpp.
1848 IssmDouble* basis = xNew<IssmDouble>(numvertices);
1849 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
1850 int* vertexpidlist = xNew<int>(numvertices);
1863 Input2* adjointy_input = NULL;
1871 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1888 for(
int i=0;i<numvertices;i++){
1890 else ge[i]+=-2.*drag*dalpha2dk*(lambda*vx)*Jdet*gauss->
weight*basis[i];
1891 _assert_(!xIsNan<IssmDouble>(ge[i]));
1897 xDelete<IssmDouble>(xyz_list_base);
1898 xDelete<IssmDouble>(basis);
1899 xDelete<IssmDouble>(ge);
1900 xDelete<int>(vertexpidlist);
◆ GradientJDragSSA()
void AdjointHorizAnalysis::GradientJDragSSA |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 1904 of file AdjointHorizAnalysis.cpp.
1917 basalelement = element;
1943 IssmDouble* basis = xNew<IssmDouble>(numvertices);
1944 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
1945 int* vertexpidlist = xNew<int>(numvertices);
1961 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
1976 for(
int i=0;i<numvertices;i++){
1977 ge[i]+=-2.*drag*dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->
weight*basis[i];
1978 _assert_(!xIsNan<IssmDouble>(ge[i]));
1984 xDelete<IssmDouble>(xyz_list);
1985 xDelete<IssmDouble>(basis);
1986 xDelete<IssmDouble>(ge);
1987 xDelete<int>(vertexpidlist);
◆ GradientJDragHydroFS()
void AdjointHorizAnalysis::GradientJDragHydroFS |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 1993 of file AdjointHorizAnalysis.cpp.
2010 IssmDouble* basis = xNew<IssmDouble>(numvertices);
2011 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
2012 int* vertexpidlist = xNew<int>(numvertices);
2030 Input2* adjointz_input = NULL;
2038 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
2051 element->
NormalBase(&normal[0],xyz_list_base);
2058 for(
int i=0;i<numvertices;i++){
2060 -lambda*(dalpha2dk*(vx - vz*normal[0]*normal[2]))
2061 -mu *(dalpha2dk*(vy - vz*normal[1]*normal[2]))
2062 -xi *(dalpha2dk*(-vx*normal[0]*normal[2]-vy*normal[1]*normal[2]))
2063 )*Jdet*gauss->
weight*basis[i];
2064 _assert_(!xIsNan<IssmDouble>(ge[i]));
2068 for(
int i=0;i<numvertices;i++){
2070 -lambda*dalpha2dk*vx
2072 )*Jdet*gauss->
weight*basis[i];
2073 _assert_(!xIsNan<IssmDouble>(ge[i]));
2080 xDelete<IssmDouble>(xyz_list_base);
2081 xDelete<IssmDouble>(basis);
2082 xDelete<IssmDouble>(ge);
2083 xDelete<int>(vertexpidlist);
◆ GradientJDragHydroL1L2()
void AdjointHorizAnalysis::GradientJDragHydroL1L2 |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
◆ GradientJDragHydroHO()
void AdjointHorizAnalysis::GradientJDragHydroHO |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 2092 of file AdjointHorizAnalysis.cpp.
2110 IssmDouble* basis = xNew<IssmDouble>(numvertices);
2111 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
2112 int* vertexpidlist = xNew<int>(numvertices);
2125 Input2* adjointy_input = NULL;
2132 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
2148 for(
int i=0;i<numvertices;i++){
2150 else ge[i]+=-dalpha2dk*(lambda*vx)*Jdet*gauss->
weight*basis[i];
2151 _assert_(!xIsNan<IssmDouble>(ge[i]));
2157 xDelete<IssmDouble>(xyz_list_base);
2158 xDelete<IssmDouble>(basis);
2159 xDelete<IssmDouble>(ge);
2160 xDelete<int>(vertexpidlist);
◆ GradientJDragHydroSSA()
void AdjointHorizAnalysis::GradientJDragHydroSSA |
( |
Element * |
element, |
|
|
Vector< IssmDouble > * |
gradient, |
|
|
int |
control_index |
|
) |
| |
Definition at line 2165 of file AdjointHorizAnalysis.cpp.
2179 basalelement = element;
2205 IssmDouble* basis = xNew<IssmDouble>(numvertices);
2206 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
2207 int* vertexpidlist = xNew<int>(numvertices);
2238 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
2262 alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
2265 vmag = sqrt(vx*vx + vy*vy);
2266 Chi = vmag/(pow(C_param,n)*pow(Neff,n)*As);
2267 Gamma = (Chi/(1.+
alpha*pow(Chi,q_exp)));
2269 Uder =Neff*C_param/(vmag*vmag*n) *
2270 (Gamma-
alpha*q_exp*pow(Chi,q_exp-1.)*Gamma*Gamma* pow(Gamma,(1.-n)/n) -
2271 n* pow(Gamma,1./n));
2274 for(
int i=0;i<numvertices;i++){
2275 ge[i]+=-dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->
weight*basis[i];
2276 _assert_(!xIsNan<IssmDouble>(ge[i]));
2282 xDelete<IssmDouble>(xyz_list);
2283 xDelete<IssmDouble>(basis);
2284 xDelete<IssmDouble>(ge);
2285 xDelete<int>(vertexpidlist);
◆ GradientJDSSA()
Definition at line 2291 of file AdjointHorizAnalysis.cpp.
2301 basalelement = element;
2327 IssmDouble* basis = xNew<IssmDouble>(numvertices);
2328 IssmDouble* ge = xNewZeroInit<IssmDouble>(numvertices);
2329 int* vertexpidlist = xNew<int>(numvertices);
2343 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
2352 basalelement->
dViscositydDSSA(&dmudD,dim,xyz_list,gauss,vx_input,vy_input);
2357 for(
int i=0;i<numvertices;i++){
2358 ge[i]+=-dmudD*thickness*(
2359 (2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1]
2360 )*Jdet*gauss->
weight*basis[i];
2361 _assert_(!xIsNan<IssmDouble>(ge[i]));
2367 xDelete<IssmDouble>(xyz_list);
2368 xDelete<IssmDouble>(basis);
2369 xDelete<IssmDouble>(ge);
2370 xDelete<int>(vertexpidlist);
◆ InputUpdateFromSolution()
void AdjointHorizAnalysis::InputUpdateFromSolution |
( |
IssmDouble * |
solution, |
|
|
Element * |
element |
|
) |
| |
|
virtual |
◆ InputUpdateFromSolutionFS()
void AdjointHorizAnalysis::InputUpdateFromSolutionFS |
( |
IssmDouble * |
solution, |
|
|
Element * |
element |
|
) |
| |
Definition at line 2384 of file AdjointHorizAnalysis.cpp.
2408 int vnumdof = vnumnodes*dim;
2409 int pnumdof = pnumnodes*1;
2412 IssmDouble* values = xNew<IssmDouble>(vnumdof+pnumdof);
2413 IssmDouble* lambdax = xNew<IssmDouble>(vnumnodes);
2414 IssmDouble* lambday = xNew<IssmDouble>(vnumnodes);
2415 IssmDouble* lambdaz = xNew<IssmDouble>(vnumnodes);
2416 IssmDouble* lambdap = xNew<IssmDouble>(pnumnodes);
2418 int* cs_list = xNew<int>(vnumnodes+pnumnodes);
2419 if(dim==2)
for(i=0;i<vnumnodes;i++) cs_list[i] =
XYEnum;
2420 else for(i=0;i<vnumnodes;i++) cs_list[i] =
XYZEnum;
2421 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] =
PressureEnum;
2428 for(i=0;i<vnumdof;i++) values[i] =solution[vdoflist[i]];
2429 for(i=0;i<pnumdof;i++) values[vnumdof+i]=solution[pdoflist[i]];
2435 for(i=0;i<vnumnodes;i++){
2436 lambdax[i] = values[i*dim+0];
2437 if(xIsNan<IssmDouble>(lambdax[i]))
_error_(
"NaN found in solution vector");
2438 if(xIsInf<IssmDouble>(lambdax[i]))
_error_(
"Inf found in solution vector");
2439 lambday[i] = values[i*dim+1];
2440 if(xIsNan<IssmDouble>(lambday[i]))
_error_(
"NaN found in solution vector");
2441 if(xIsInf<IssmDouble>(lambday[i]))
_error_(
"Inf found in solution vector");
2443 lambdaz[i] = values[i*dim+2];
2444 if(xIsNan<IssmDouble>(lambdaz[i]))
_error_(
"NaN found in solution vector");
2445 if(xIsInf<IssmDouble>(lambdaz[i]))
_error_(
"Inf found in solution vector");
2448 for(i=0;i<pnumnodes;i++){
2449 lambdap[i] = values[vnumdof+i];
2450 if(xIsNan<IssmDouble>(lambdap[i]))
_error_(
"NaN found in solution vector");
2451 if(xIsInf<IssmDouble>(lambdap[i]))
_error_(
"Inf found in solution vector");
2456 for(i=0;i<pnumnodes;i++) lambdap[i]=lambdap[i]*FSreconditioning;
2468 xDelete<int>(vdoflist);
2469 xDelete<int>(pdoflist);
2470 xDelete<int>(cs_list);
2471 xDelete<IssmDouble>(lambdap);
2472 xDelete<IssmDouble>(lambdaz);
2473 xDelete<IssmDouble>(lambday);
2474 xDelete<IssmDouble>(lambdax);
2475 xDelete<IssmDouble>(values);
◆ InputUpdateFromSolutionHoriz()
void AdjointHorizAnalysis::InputUpdateFromSolutionHoriz |
( |
IssmDouble * |
solution, |
|
|
Element * |
element |
|
) |
| |
Definition at line 2477 of file AdjointHorizAnalysis.cpp.
2488 else numdof = numnodes*1;
2491 IssmDouble* values = xNew<IssmDouble>(numdof);
2492 IssmDouble* lambdax = xNew<IssmDouble>(numnodes);
2493 IssmDouble* lambday = xNew<IssmDouble>(numnodes);
2496 for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
2502 for(i=0;i<numnodes;i++){
2504 lambdax[i]=values[i*2+0];
2505 lambday[i]=values[i*2+1];
2507 else {lambdax[i]=values[i];lambday[i]=0;}
2509 if(xIsNan<IssmDouble>(lambdax[i]))
_error_(
"NaN found in solution vector");
2510 if(xIsInf<IssmDouble>(lambdax[i]))
_error_(
"Inf found in solution vector");
2520 xDelete<IssmDouble>(values);
2521 xDelete<IssmDouble>(lambdax);
2522 xDelete<IssmDouble>(lambday);
2523 xDelete<int>(doflist);
◆ UpdateConstraints()
void AdjointHorizAnalysis::UpdateConstraints |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
The documentation for this class was generated from the following files:
@ FrictionCoefficientEnum
void TransformStiffnessMatrixCoord(ElementMatrix *Ke, int cs_enum)
virtual int GetElementType(void)=0
void GradientJBbarFS(Element *element, Vector< IssmDouble > *gradient, int control_index)
ElementMatrix * CreateKMatrix(Element *element)
void GradientJDragGradient(Element *element, Vector< IssmDouble > *gradient, int control_index)
void TransformSolutionCoord(IssmDouble *solution, int cs_enum)
virtual int GetNumberOfNodes(void)=0
ElementMatrix * CreateKMatrixHO(Element *element)
@ FrictionEffectivePressureEnum
void FindParam(bool *pvalue, int paramenum)
void InputUpdateFromSolutionHoriz(IssmDouble *solution, Element *element)
void dViscositydDSSA(IssmDouble *pdmudB, int dim, IssmDouble *xyz_list, Gauss *gauss, Input2 *vx_input, Input2 *vy_input)
virtual Gauss * NewGaussBase(int order)=0
void GradientJBHO(Element *element, Vector< IssmDouble > *gradient, int control_index)
@ InversionCostFunctionsCoefficientsEnum
void GetAlphaComplement(IssmDouble *alpha_complement, Gauss *gauss)
@ StressbalanceFSreconditioningEnum
void InputUpdateFromSolutionFS(IssmDouble *solution, Element *element)
virtual int PressureInterpolation()=0
ElementMatrix * CreateKMatrixL1L2(Element *element)
virtual Element * SpawnBasalElement(void)=0
void GradientJDragHO(Element *element, Vector< IssmDouble > *gradient, int control_index)
void dViscositydBHO(IssmDouble *pdmudB, int dim, IssmDouble *xyz_list, Gauss *gauss, Input2 *vx_input, Input2 *vy_input)
void GradientJDragL1L2(Element *element, Vector< IssmDouble > *gradient, int control_index)
virtual void ViscosityHODerivativeEpsSquare(IssmDouble *pmu_prime, IssmDouble *epsilon, Gauss *gauss)=0
void TransformLoadVectorCoord(ElementVector *pe, int cs_enum)
void GradientJDragHydroFS(Element *element, Vector< IssmDouble > *gradient, int control_index)
@ SurfaceRelVelMisfitEnum
void GradientJDragFS(Element *element, Vector< IssmDouble > *gradient, int control_index)
virtual void JacobianDeterminantBase(IssmDouble *Jdet, IssmDouble *xyz_list_base, Gauss *gauss)=0
virtual void JacobianDeterminantTop(IssmDouble *Jdet, IssmDouble *xyz_list_base, Gauss *gauss)=0
virtual void NormalBase(IssmDouble *normal, IssmDouble *xyz_list)=0
virtual void ViscosityFSDerivativeEpsSquare(IssmDouble *pmu_prime, IssmDouble *epsilon, Gauss *gauss)=0
virtual void NodalFunctionsP1Derivatives(IssmDouble *dbasis, IssmDouble *xyz_list, Gauss *gauss)=0
@ DragCoefficientAbsGradientEnum
@ SurfaceLogVxVyMisfitEnum
@ MaterialsRheologyBbarEnum
void GetDofListLocalPressure(int **pdoflist, int setenum)
@ SurfaceAbsVelMisfitEnum
virtual Input2 * GetInput2(int inputenum)=0
void DeleteMaterials(void)
virtual void NodalFunctions(IssmDouble *basis, Gauss *gauss)=0
void GradientJDragHydroL1L2(Element *element, Vector< IssmDouble > *gradient, int control_index)
virtual DatasetInput2 * GetDatasetInput2(int inputenum)
@ RheologyBInitialguessEnum
@ InversionIncompleteAdjointEnum
virtual void NodalFunctionsP1(IssmDouble *basis, Gauss *gauss)=0
ElementVector * NewElementVector(int approximation_enum=NoneApproximationEnum)
void SetValues(int ssize, int *list, doubletype *values, InsMode mode)
virtual void AddInput2(int input_enum, IssmDouble *values, int interpolation_enum)
virtual Gauss * NewGauss(void)=0
@ InversionCostFunctionsEnum
void dViscositydBSSA(IssmDouble *pdmudB, int dim, IssmDouble *xyz_list, Gauss *gauss, Input2 *vx_input, Input2 *vy_input)
const char * EnumToStringx(int enum_in)
void GradientJBGradient(Element *element, Vector< IssmDouble > *gradient, int control_index)
@ ThicknessAlongGradientEnum
IssmDouble alpha(IssmDouble x, IssmDouble y, IssmDouble z, int testid)
void GetVerticesCoordinates(IssmDouble **xyz_list)
ElementVector * CreatePVectorL1L2(Element *element)
void GradientJDragHydroSSA(Element *element, Vector< IssmDouble > *gradient, int control_index)
void GradientJBinitial(Element *element, Vector< IssmDouble > *gradient, int control_index)
ElementVector * CreatePVectorSSA(Element *element)
void GradientJBbarSSA(Element *element, Vector< IssmDouble > *gradient, int control_index)
virtual int NumberofNodesPressure(void)=0
void GradientJDSSA(Element *element, Vector< IssmDouble > *gradient, int control_index)
void GradientJBFS(Element *element, Vector< IssmDouble > *gradient, int control_index)
ElementVector * CreatePVectorHO(Element *element)
ElementVector * CreatePVectorFS(Element *element)
void GetDofListLocal(int **pdoflist, int approximation_enum, int setenum)
virtual void NodalFunctionsVelocity(IssmDouble *basis, Gauss *gauss)=0
void StrainRateHO(IssmDouble *epsilon, IssmDouble *xyz_list, Gauss *gauss, Input2 *vx_input, Input2 *vy_input)
virtual void GetVerticesCoordinatesBase(IssmDouble **xyz_list)=0
#define _error_(StreamArgs)
@ RheologyBAbsGradientEnum
virtual int begin(void)=0
void GradientJBbarGradient(Element *element, Vector< IssmDouble > *gradient, int control_index)
@ InversionNumCostFunctionsEnum
@ SurfaceLogVelMisfitEnum
ElementMatrix * CreateKMatrixFS(Element *element)
virtual void JacobianDeterminant(IssmDouble *Jdet, IssmDouble *xyz_list, Gauss *gauss)=0
virtual void GaussPoint(int ig)=0
void GetInputValue(bool *pvalue, int enum_type)
virtual int VelocityInterpolation()=0
void StrainRateSSA(IssmDouble *epsilon, IssmDouble *xyz_list, Gauss *gauss, Input2 *vx_input, Input2 *vy_input)
virtual void GetVerticesCoordinatesTop(IssmDouble **xyz_list)=0
@ SurfaceAverageVelMisfitEnum
virtual Gauss * NewGaussTop(int order)=0
virtual void ViscositySSADerivativeEpsSquare(IssmDouble *pmu_prime, IssmDouble *epsilon, Gauss *gauss)=0
@ ThicknessAbsGradientEnum
virtual int GetNumberOfVertices(void)=0
void GradientJBSSA(Element *element, Vector< IssmDouble > *gradient, int control_index)
void GradientJDragHydroHO(Element *element, Vector< IssmDouble > *gradient, int control_index)
void GradientIndexing(int *indexing, int control_index)
@ RheologyBInitialguessMisfitEnum
void GetDofListLocalVelocity(int **pdoflist, int setenum)
virtual void NodalFunctionsDerivatives(IssmDouble *dbasis, IssmDouble *xyz_list, Gauss *gauss)=0
@ RheologyBbarAbsGradientEnum
virtual int NumberofNodesVelocity(void)=0
void GradientJDragSSA(Element *element, Vector< IssmDouble > *gradient, int control_index)
void GradientJBbarHO(Element *element, Vector< IssmDouble > *gradient, int control_index)
void GradientJBbarL1L2(Element *element, Vector< IssmDouble > *gradient, int control_index)
ElementMatrix * CreateKMatrixSSA(Element *element)
@ ThicknessAcrossGradientEnum