Changeset 17976
- Timestamp:
- 05/09/14 15:37:18 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.h
r17975 r17976 276 276 277 277 virtual void Gradj(Vector<IssmDouble>* gradient,int control_type,int control_index)=0; 278 virtual IssmDouble ThicknessAbsMisfit(void)=0;279 virtual IssmDouble SurfaceLogVxVyMisfit(void)=0;280 virtual IssmDouble SurfaceAverageVelMisfit(void)=0;281 virtual IssmDouble ThicknessAbsGradient(void)=0;282 virtual IssmDouble ThicknessAlongGradient(void)=0;283 virtual IssmDouble ThicknessAcrossGradient(void)=0;284 virtual IssmDouble BalancethicknessMisfit(void)=0;285 virtual IssmDouble RheologyBbarAbsGradient(void)=0;286 278 virtual void ControlInputGetGradient(Vector<IssmDouble>* gradient,int enum_type,int control_index)=0; 287 279 virtual void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r17975 r17976 3329 3329 } 3330 3330 /*}}}*/ 3331 IssmDouble Penta::SurfaceAverageVelMisfit(void){/*{{{*/3332 3333 int approximation;3334 IssmDouble J;3335 Tria* tria=NULL;3336 3337 /*retrieve inputs :*/3338 inputs->GetInputValue(&approximation,ApproximationEnum);3339 3340 /*If on water, return 0: */3341 if(!IsIceInElement())return 0;3342 3343 /*Bail out if this element if:3344 * -> Non SSA and not on the surface3345 * -> SSA (2d model) and not on bed) */3346 if ((approximation!=SSAApproximationEnum && !IsOnSurface()) || (approximation==SSAApproximationEnum && !IsOnBase())){3347 return 0;3348 }3349 else if (approximation==SSAApproximationEnum){3350 3351 /*This element should be collapsed into a tria element at its base. Create this tria element,3352 * and compute SurfaceAverageVelMisfit*/3353 tria=(Tria*)SpawnTria(0,1,2);3354 J=tria->SurfaceAverageVelMisfit();3355 delete tria->material; delete tria;3356 return J;3357 }3358 else{3359 3360 tria=(Tria*)SpawnTria(3,4,5);3361 J=tria->SurfaceAverageVelMisfit();3362 delete tria->material; delete tria;3363 return J;3364 }3365 }3366 /*}}}*/3367 IssmDouble Penta::SurfaceLogVxVyMisfit(void){/*{{{*/3368 3369 IssmDouble J;3370 Tria* tria=NULL;3371 3372 /*inputs: */3373 int approximation;3374 3375 /*retrieve inputs :*/3376 inputs->GetInputValue(&approximation,ApproximationEnum);3377 3378 /*If on water, return 0: */3379 if(!IsIceInElement())return 0;3380 3381 /*Bail out if this element if:3382 * -> Non SSA and not on the surface3383 * -> SSA (2d model) and not on bed) */3384 if ((approximation!=SSAApproximationEnum && !IsOnSurface()) || (approximation==SSAApproximationEnum && !IsOnBase())){3385 return 0;3386 }3387 else if (approximation==SSAApproximationEnum){3388 3389 /*This element should be collapsed into a tria element at its base. Create this tria element,3390 * and compute SurfaceLogVxVyMisfit*/3391 tria=(Tria*)SpawnTria(0,1,2);3392 J=tria->SurfaceLogVxVyMisfit();3393 delete tria->material; delete tria;3394 return J;3395 }3396 else{3397 3398 tria=(Tria*)SpawnTria(3,4,5);3399 J=tria->SurfaceLogVxVyMisfit();3400 delete tria->material; delete tria;3401 return J;3402 }3403 }3404 /*}}}*/3405 IssmDouble Penta::ThicknessAbsGradient(void){/*{{{*/3406 3407 _error_("Not implemented yet");3408 }3409 /*}}}*/3410 IssmDouble Penta::ThicknessAbsMisfit(void){/*{{{*/3411 3412 int approximation;3413 IssmDouble J;3414 Tria* tria=NULL;3415 3416 /*retrieve inputs :*/3417 inputs->GetInputValue(&approximation,ApproximationEnum);3418 3419 /*If on water, return 0: */3420 if(!IsIceInElement())return 0;3421 _error_("Not implemented yet");3422 3423 tria=(Tria*)SpawnTria(0,1,2);3424 J=tria->ThicknessAbsMisfit();3425 delete tria->material; delete tria;3426 return J;3427 }3428 /*}}}*/3429 IssmDouble Penta::RheologyBbarAbsGradient(void){/*{{{*/3430 3431 IssmDouble J;3432 Tria* tria=NULL;3433 3434 /*If on water, on shelf or not on bed, skip: */3435 if(!IsIceInElement() || !IsOnBase()) return 0;3436 3437 tria=(Tria*)SpawnTria(0,1,2);3438 J=tria->RheologyBbarAbsGradient();3439 delete tria->material; delete tria;3440 return J;3441 }3442 /*}}}*/3443 3331 void Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/ 3444 3332 -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r17975 r17976 146 146 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index); 147 147 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum); 148 IssmDouble RheologyBbarAbsGradient(void);149 IssmDouble ThicknessAbsMisfit(void);150 IssmDouble SurfaceLogVxVyMisfit(void);151 IssmDouble SurfaceAverageVelMisfit(void);152 IssmDouble ThicknessAbsGradient(void);153 IssmDouble ThicknessAlongGradient(void){_error_("not supported");};154 IssmDouble ThicknessAcrossGradient(void){_error_("not supported");};155 IssmDouble BalancethicknessMisfit(void){_error_("not supported");};156 148 void InputControlUpdate(IssmDouble scalar,bool save_parameter); 157 149 IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r17975 r17976 187 187 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");}; 188 188 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");}; 189 IssmDouble RheologyBbarAbsGradient(void){_error_("not implemented yet");};190 IssmDouble ThicknessAbsMisfit(void){_error_("not implemented yet");};191 IssmDouble ThicknessAbsGradient(void){_error_("not implemented yet");};192 IssmDouble ThicknessAlongGradient(void){_error_("not implemented yet");};193 IssmDouble ThicknessAcrossGradient(void){_error_("not implemented yet");};194 IssmDouble BalancethicknessMisfit(void){_error_("not implemented yet");};195 IssmDouble SurfaceLogVxVyMisfit(void){_error_("not implemented yet");};196 IssmDouble SurfaceAverageVelMisfit(void){_error_("not implemented yet");};197 189 void InputControlUpdate(IssmDouble scalar,bool save_parameter){_error_("not implemented yet");}; 198 190 -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r17975 r17976 192 192 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");}; 193 193 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum){_error_("not implemented yet");}; 194 IssmDouble RheologyBbarAbsGradient(void){_error_("not implemented yet");};195 IssmDouble ThicknessAbsMisfit(void){_error_("not implemented yet");};196 IssmDouble ThicknessAbsGradient(void){_error_("not implemented yet");};197 IssmDouble ThicknessAlongGradient(void){_error_("not implemented yet");};198 IssmDouble ThicknessAcrossGradient(void){_error_("not implemented yet");};199 IssmDouble BalancethicknessMisfit(void){_error_("not implemented yet");};200 IssmDouble SurfaceLogVxVyMisfit(void){_error_("not implemented yet");};201 IssmDouble SurfaceAverageVelMisfit(void){_error_("not implemented yet");};202 194 void InputControlUpdate(IssmDouble scalar,bool save_parameter){_error_("not implemented yet");}; 203 195 -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r17975 r17976 2708 2708 #endif 2709 2709 2710 IssmDouble Tria::BalancethicknessMisfit(void){/*{{{*/2711 2712 /* Intermediaries */2713 IssmDouble Jelem = 0;2714 IssmDouble weight;2715 IssmDouble Jdet,temp;2716 IssmDouble xyz_list[NUMVERTICES][3];2717 IssmDouble dH[2];2718 IssmDouble vx,vy,H;2719 IssmDouble dvx[2],dvy[2];2720 IssmDouble dhdt,basal_melting,surface_mass_balance;2721 GaussTria *gauss = NULL;2722 2723 /*If on water, return 0: */2724 if(!IsIceInElement()) return 0;2725 2726 /*Retrieve all inputs we will be needing: */2727 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);2728 Input* weights_input = inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);2729 Input* thickness_input = inputs->GetInput(ThicknessEnum); _assert_(thickness_input);2730 Input* vx_input = inputs->GetInput(VxEnum); _assert_(vx_input);2731 Input* vy_input = inputs->GetInput(VyEnum); _assert_(vy_input);2732 Input* surface_mass_balance_input = inputs->GetInput(SurfaceforcingsMassBalanceEnum); _assert_(surface_mass_balance_input);2733 Input* basal_melting_input = inputs->GetInput(BasalforcingsMeltingRateEnum); _assert_(basal_melting_input);2734 Input* dhdt_input = inputs->GetInput(BalancethicknessThickeningRateEnum); _assert_(dhdt_input);2735 2736 /* Start looping on the number of gaussian points: */2737 gauss=new GaussTria(2);2738 for(int ig=gauss->begin();ig<gauss->end();ig++){2739 2740 gauss->GaussPoint(ig);2741 2742 /* Get Jacobian determinant: */2743 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);2744 2745 /*Get all parameters at gaussian point*/2746 weights_input->GetInputValue(&weight,gauss,BalancethicknessMisfitEnum);2747 thickness_input->GetInputValue(&H, gauss);2748 thickness_input->GetInputDerivativeValue(&dH[0],&xyz_list[0][0],gauss);2749 surface_mass_balance_input->GetInputValue(&surface_mass_balance,gauss);2750 basal_melting_input->GetInputValue(&basal_melting,gauss);2751 dhdt_input->GetInputValue(&dhdt,gauss);2752 vx_input->GetInputValue(&vx,gauss);2753 vx_input->GetInputDerivativeValue(&dvx[0],&xyz_list[0][0],gauss);2754 vy_input->GetInputValue(&vy,gauss);2755 vy_input->GetInputDerivativeValue(&dvy[0],&xyz_list[0][0],gauss);2756 2757 /*Balance thickness soft constraint J = 1/2 (div(Hv)-a)^2*/2758 temp = vx*dH[0]+vy*dH[1]+H*(dvx[0]+dvy[1]) - (surface_mass_balance-basal_melting-dhdt);2759 Jelem+=weight*1/2*temp*temp*Jdet*gauss->weight;2760 }2761 2762 /*Clean up and return*/2763 delete gauss;2764 return Jelem;2765 }2766 /*}}}*/2767 2710 void Tria::InputControlUpdate(IssmDouble scalar,bool save_parameter){/*{{{*/ 2768 2711 … … 3474 3417 } 3475 3418 /*}}}*/ 3476 IssmDouble Tria::RheologyBbarAbsGradient(void){/*{{{*/3477 3478 /* Intermediaries */3479 IssmDouble Jelem = 0;3480 IssmDouble weight;3481 IssmDouble Jdet;3482 IssmDouble xyz_list[NUMVERTICES][3];3483 IssmDouble dp[NDOF2];3484 GaussTria *gauss = NULL;3485 3486 /*retrieve parameters and inputs*/3487 3488 /*If on water, return 0: */3489 if(!IsIceInElement()) return 0;3490 3491 /*Retrieve all inputs we will be needing: */3492 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);3493 Input* weights_input =inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);3494 Input* rheologyb_input=inputs->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input);3495 3496 /* Start looping on the number of gaussian points: */3497 gauss=new GaussTria(2);3498 for(int ig=gauss->begin();ig<gauss->end();ig++){3499 3500 gauss->GaussPoint(ig);3501 3502 /* Get Jacobian determinant: */3503 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);3504 3505 /*Get all parameters at gaussian point*/3506 weights_input->GetInputValue(&weight,gauss,RheologyBbarAbsGradientEnum);3507 rheologyb_input->GetInputDerivativeValue(&dp[0],&xyz_list[0][0],gauss);3508 3509 /*Tikhonov regularization: J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */3510 Jelem+=weight*1/2*(dp[0]*dp[0] + dp[1]*dp[1])*Jdet*gauss->weight;3511 }3512 3513 /*Clean up and return*/3514 delete gauss;3515 return Jelem;3516 }3517 /*}}}*/3518 IssmDouble Tria::SurfaceAverageVelMisfit(void){/*{{{*/3519 3520 IssmDouble Jelem=0,S,Jdet;3521 IssmDouble misfit;3522 IssmDouble vx,vy,vxobs,vyobs,weight;3523 IssmDouble xyz_list[NUMVERTICES][3];3524 GaussTria *gauss=NULL;3525 3526 /*If on water, return 0: */3527 if(!IsIceInElement())return 0;3528 3529 /* Get node coordinates and dof list: */3530 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);3531 3532 /*Retrieve all inputs we will be needing: */3533 inputs->GetInputValue(&S,SurfaceAreaEnum);3534 Input* weights_input=inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);3535 Input* vx_input =inputs->GetInput(VxEnum); _assert_(vx_input);3536 Input* vy_input =inputs->GetInput(VyEnum); _assert_(vy_input);3537 Input* vxobs_input =inputs->GetInput(InversionVxObsEnum); _assert_(vxobs_input);3538 Input* vyobs_input =inputs->GetInput(InversionVyObsEnum); _assert_(vyobs_input);3539 3540 /* Start looping on the number of gaussian points: */3541 gauss=new GaussTria(3);3542 for(int ig=gauss->begin();ig<gauss->end();ig++){3543 3544 gauss->GaussPoint(ig);3545 3546 /* Get Jacobian determinant: */3547 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);3548 3549 /*Get all parameters at gaussian point*/3550 weights_input->GetInputValue(&weight,gauss,SurfaceAverageVelMisfitEnum);3551 vx_input->GetInputValue(&vx,gauss);3552 vy_input->GetInputValue(&vy,gauss);3553 vxobs_input->GetInputValue(&vxobs,gauss);3554 vyobs_input->GetInputValue(&vyobs,gauss);3555 3556 /*Compute SurfaceAverageVelMisfitEnum:3557 *3558 * 1 2 23559 * J = --- sqrt( (u - u ) + (v - v ) )3560 * S obs obs3561 */3562 misfit=1/S*sqrt( pow(vx-vxobs,2) + pow(vy-vyobs,2));3563 3564 /*Add to cost function*/3565 Jelem+=misfit*weight*Jdet*gauss->weight;3566 }3567 3568 /*clean-up and Return: */3569 delete gauss;3570 return Jelem;3571 }3572 /*}}}*/3573 IssmDouble Tria::SurfaceLogVxVyMisfit(void){/*{{{*/3574 3575 IssmDouble Jelem=0, S=0;3576 IssmDouble epsvel=2.220446049250313e-16;3577 IssmDouble meanvel=3.170979198376458e-05; /*1000 m/yr*/3578 IssmDouble misfit, Jdet;3579 IssmDouble vx,vy,vxobs,vyobs,weight;3580 IssmDouble xyz_list[NUMVERTICES][3];3581 GaussTria *gauss=NULL;3582 3583 /*If on water, return 0: */3584 if(!IsIceInElement())return 0;3585 3586 /* Get node coordinates and dof list: */3587 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);3588 3589 /*Retrieve all inputs we will be needing: */3590 Input* weights_input=inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);3591 Input* vx_input =inputs->GetInput(VxEnum); _assert_(vx_input);3592 Input* vy_input =inputs->GetInput(VyEnum); _assert_(vy_input);3593 Input* vxobs_input =inputs->GetInput(InversionVxObsEnum); _assert_(vxobs_input);3594 Input* vyobs_input =inputs->GetInput(InversionVyObsEnum); _assert_(vyobs_input);3595 3596 /* Start looping on the number of gaussian points: */3597 gauss=new GaussTria(4);3598 for(int ig=gauss->begin();ig<gauss->end();ig++){3599 3600 gauss->GaussPoint(ig);3601 3602 /* Get Jacobian determinant: */3603 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);3604 3605 /*Get all parameters at gaussian point*/3606 weights_input->GetInputValue(&weight,gauss,SurfaceLogVxVyMisfitEnum);3607 vx_input->GetInputValue(&vx,gauss);3608 vy_input->GetInputValue(&vy,gauss);3609 vxobs_input->GetInputValue(&vxobs,gauss);3610 vyobs_input->GetInputValue(&vyobs,gauss);3611 3612 /*Compute SurfaceRelVelMisfit:3613 *3614 * 1 [ |u| + eps 2 |v| + eps 2 ]3615 * J = --- \bar{v}^2 | log ( ----------- ) + log ( ----------- ) |3616 * 2 [ |u |+ eps |v |+ eps ]3617 * obs obs3618 */3619 misfit=0.5*pow(meanvel,2)*(3620 pow(log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)),2) +3621 pow(log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)),2) );3622 3623 /*Add to cost function*/3624 Jelem+=misfit*weight*Jdet*gauss->weight;3625 }3626 3627 /*clean-up and Return: */3628 delete gauss;3629 return Jelem;3630 }3631 /*}}}*/3632 IssmDouble Tria::ThicknessAbsGradient(void){/*{{{*/3633 3634 /* Intermediaries */3635 IssmDouble Jelem = 0;3636 IssmDouble weight;3637 IssmDouble Jdet;3638 IssmDouble xyz_list[NUMVERTICES][3];3639 IssmDouble dp[NDOF2];3640 GaussTria *gauss = NULL;3641 3642 /*retrieve parameters and inputs*/3643 3644 /*If on water, return 0: */3645 if(!IsIceInElement()) return 0;3646 3647 /*Retrieve all inputs we will be needing: */3648 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);3649 Input* weights_input =inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);3650 Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);3651 3652 /* Start looping on the number of gaussian points: */3653 gauss=new GaussTria(2);3654 for(int ig=gauss->begin();ig<gauss->end();ig++){3655 3656 gauss->GaussPoint(ig);3657 3658 /* Get Jacobian determinant: */3659 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);3660 3661 /*Get all parameters at gaussian point*/3662 weights_input->GetInputValue(&weight,gauss,ThicknessAbsGradientEnum);3663 thickness_input->GetInputDerivativeValue(&dp[0],&xyz_list[0][0],gauss);3664 3665 /*Tikhonov regularization: J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */3666 Jelem+=weight*1/2*(dp[0]*dp[0]+dp[1]*dp[1])*Jdet*gauss->weight;3667 }3668 3669 /*Clean up and return*/3670 delete gauss;3671 return Jelem;3672 }3673 /*}}}*/3674 IssmDouble Tria::ThicknessAlongGradient(void){/*{{{*/3675 3676 /* Intermediaries */3677 IssmDouble Jelem = 0;3678 IssmDouble weight;3679 IssmDouble Jdet;3680 IssmDouble xyz_list[NUMVERTICES][3];3681 IssmDouble dp[NDOF2];3682 IssmDouble vx,vy,vel;3683 GaussTria *gauss = NULL;3684 3685 /*retrieve parameters and inputs*/3686 3687 /*If on water, return 0: */3688 if(!IsIceInElement()) return 0;3689 3690 /*Retrieve all inputs we will be needing: */3691 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);3692 Input* weights_input = inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);3693 Input* thickness_input= inputs->GetInput(ThicknessEnum); _assert_(thickness_input);3694 Input* vx_input = inputs->GetInput(VxEnum); _assert_(vx_input);3695 Input* vy_input = inputs->GetInput(VyEnum); _assert_(vy_input);3696 3697 /* Start looping on the number of gaussian points: */3698 gauss=new GaussTria(2);3699 for(int ig=gauss->begin();ig<gauss->end();ig++){3700 3701 gauss->GaussPoint(ig);3702 3703 /* Get Jacobian determinant: */3704 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);3705 3706 /*Get all parameters at gaussian point*/3707 weights_input->GetInputValue(&weight,gauss,ThicknessAlongGradientEnum);3708 thickness_input->GetInputDerivativeValue(&dp[0],&xyz_list[0][0],gauss);3709 vx_input->GetInputValue(&vx,gauss);3710 vy_input->GetInputValue(&vy,gauss);3711 vel = sqrt(vx*vx+vy*vy);3712 vx = vx/(vel+1.e-9);3713 vy = vy/(vel+1.e-9);3714 3715 /*J = 1/2 ( vx*dH/dx + vy*dH/dy )^2 */3716 Jelem+=weight*1/2*(vx*dp[0] + vy*dp[1])*(vx*dp[0] + vy*dp[1])*Jdet*gauss->weight;3717 }3718 3719 /*Clean up and return*/3720 delete gauss;3721 return Jelem;3722 }3723 /*}}}*/3724 IssmDouble Tria::ThicknessAcrossGradient(void){/*{{{*/3725 3726 /* Intermediaries */3727 IssmDouble Jelem = 0;3728 IssmDouble weight;3729 IssmDouble Jdet;3730 IssmDouble xyz_list[NUMVERTICES][3];3731 IssmDouble dp[NDOF2];3732 IssmDouble vx,vy,vel;3733 GaussTria *gauss = NULL;3734 3735 /*retrieve parameters and inputs*/3736 3737 /*If on water, return 0: */3738 if(!IsIceInElement()) return 0;3739 3740 /*Retrieve all inputs we will be needing: */3741 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);3742 Input* weights_input = inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);3743 Input* thickness_input= inputs->GetInput(ThicknessEnum); _assert_(thickness_input);3744 Input* vx_input = inputs->GetInput(VxEnum); _assert_(vx_input);3745 Input* vy_input = inputs->GetInput(VyEnum); _assert_(vy_input);3746 3747 /* Start looping on the number of gaussian points: */3748 gauss=new GaussTria(2);3749 for(int ig=gauss->begin();ig<gauss->end();ig++){3750 3751 gauss->GaussPoint(ig);3752 3753 /* Get Jacobian determinant: */3754 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);3755 3756 /*Get all parameters at gaussian point*/3757 weights_input->GetInputValue(&weight,gauss,ThicknessAcrossGradientEnum);3758 thickness_input->GetInputDerivativeValue(&dp[0],&xyz_list[0][0],gauss);3759 vx_input->GetInputValue(&vx,gauss);3760 vy_input->GetInputValue(&vy,gauss);3761 vel = sqrt(vx*vx+vy*vy);3762 vx = vx/(vel+1.e-9);3763 vy = vy/(vel+1.e-9);3764 3765 /*J = 1/2 ( -vy*dH/dx + vx*dH/dy )^2 */3766 Jelem+=weight*1/2*(-vy*dp[0] + vx*dp[1])*(-vy*dp[0] + vx*dp[1])*Jdet*gauss->weight;3767 }3768 3769 /*Clean up and return*/3770 delete gauss;3771 return Jelem;3772 }3773 /*}}}*/3774 IssmDouble Tria::ThicknessAbsMisfit(void){/*{{{*/3775 3776 /*Intermediaries*/3777 IssmDouble thickness,thicknessobs,weight;3778 IssmDouble Jdet;3779 IssmDouble Jelem = 0;3780 IssmDouble xyz_list[NUMVERTICES][3];3781 GaussTria *gauss = NULL;3782 IssmDouble dH[2];3783 3784 /*If on water, return 0: */3785 if(!IsIceInElement())return 0;3786 3787 /*Retrieve all inputs we will be needing: */3788 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);3789 Input* thickness_input =inputs->GetInput(ThicknessEnum); _assert_(thickness_input);3790 Input* thicknessobs_input=inputs->GetInput(InversionThicknessObsEnum);_assert_(thicknessobs_input);3791 Input* weights_input =inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);3792 3793 /* Start looping on the number of gaussian points: */3794 gauss=new GaussTria(2);3795 for(int ig=gauss->begin();ig<gauss->end();ig++){3796 3797 gauss->GaussPoint(ig);3798 3799 /* Get Jacobian determinant: */3800 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);3801 3802 /*Get parameters at gauss point*/3803 thickness_input->GetInputValue(&thickness,gauss);3804 thickness_input->GetInputDerivativeValue(&dH[0],&xyz_list[0][0],gauss);3805 thicknessobs_input->GetInputValue(&thicknessobs,gauss);3806 weights_input->GetInputValue(&weight,gauss,ThicknessAbsMisfitEnum);3807 3808 /*compute ThicknessAbsMisfit*/3809 Jelem+=0.5*(thickness-thicknessobs)*(thickness-thicknessobs)*weight*Jdet*gauss->weight;3810 }3811 3812 /* clean up and Return: */3813 delete gauss;3814 return Jelem;3815 }3816 /*}}}*/3817 3419 void Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/ 3818 3420 -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r17975 r17976 156 156 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index); 157 157 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum); 158 IssmDouble RheologyBbarAbsGradient(void);159 IssmDouble ThicknessAbsMisfit(void);160 IssmDouble ThicknessAbsGradient(void);161 IssmDouble ThicknessAlongGradient(void);162 IssmDouble ThicknessAcrossGradient(void);163 IssmDouble BalancethicknessMisfit(void);164 IssmDouble SurfaceLogVxVyMisfit(void);165 IssmDouble SurfaceAverageVelMisfit(void);166 158 void InputControlUpdate(IssmDouble scalar,bool save_parameter); 167 159 -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r17907 r17976 1134 1134 void FemModel::BalancethicknessMisfitx(IssmDouble* presponse){/*{{{*/ 1135 1135 1136 IssmDouble J = 0; 1136 /*output: */ 1137 IssmDouble J=0.; 1137 1138 IssmDouble J_sum; 1138 1139 1139 for(int i=0;i<this->elements->Size();i++){ 1140 Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i)); 1141 J+=element->BalancethicknessMisfit(); 1142 } 1140 IssmDouble weight,vx,vy,H,dvx[2],dvy[2],dH[2]; 1141 IssmDouble temp,Jdet,dhdt,basal_melting,surface_mass_balance; 1142 IssmDouble* xyz_list = NULL; 1143 IssmDouble dp[3]; 1144 1145 /*Compute Misfit: */ 1146 for(int i=0;i<elements->Size();i++){ 1147 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 1148 1149 /*If on water, return 0: */ 1150 if(!element->IsIceInElement()) continue; 1151 1152 /* Get node coordinates*/ 1153 element->GetVerticesCoordinates(&xyz_list); 1154 Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1155 Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input); 1156 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 1157 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 1158 Input* surface_mass_balance_input = element->GetInput(SurfaceforcingsMassBalanceEnum); _assert_(surface_mass_balance_input); 1159 Input* basal_melting_input = element->GetInput(BasalforcingsMeltingRateEnum); _assert_(basal_melting_input); 1160 Input* dhdt_input = element->GetInput(BalancethicknessThickeningRateEnum); _assert_(dhdt_input); 1161 1162 /* Start looping on the number of gaussian points: */ 1163 Gauss* gauss=element->NewGauss(2); 1164 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1165 1166 gauss->GaussPoint(ig); 1167 1168 /* Get Jacobian determinant: */ 1169 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 1170 1171 /*Get all parameters at gaussian point*/ 1172 weights_input->GetInputValue(&weight,gauss,BalancethicknessMisfitEnum); 1173 thickness_input->GetInputValue(&H, gauss); 1174 thickness_input->GetInputDerivativeValue(&dH[0],xyz_list,gauss); 1175 surface_mass_balance_input->GetInputValue(&surface_mass_balance,gauss); 1176 basal_melting_input->GetInputValue(&basal_melting,gauss); 1177 dhdt_input->GetInputValue(&dhdt,gauss); 1178 vx_input->GetInputValue(&vx,gauss); 1179 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 1180 vy_input->GetInputValue(&vy,gauss); 1181 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 1182 1183 /*Balance thickness soft constraint J = 1/2 (div(Hv)-a)^2*/ 1184 temp = vx*dH[0]+vy*dH[1]+H*(dvx[0]+dvy[1]) - (surface_mass_balance-basal_melting-dhdt); 1185 J +=weight*1/2*temp*temp*Jdet*gauss->weight; 1186 } 1187 1188 /*clean up and Return: */ 1189 xDelete<IssmDouble>(xyz_list); 1190 delete gauss; 1191 } 1192 1193 /*Sum all J from all cpus of the cluster:*/ 1143 1194 ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); 1144 1195 ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); … … 1151 1202 void FemModel::ThicknessAbsGradientx( IssmDouble* pJ){/*{{{*/ 1152 1203 1153 /*Intermediary*/1154 int i;1155 Element* element=NULL;1156 1157 1204 /*output: */ 1158 IssmDouble J=0 ;1205 IssmDouble J=0.; 1159 1206 IssmDouble J_sum; 1160 1207 1208 IssmDouble thickness,thicknessobs,weight; 1209 IssmDouble Jdet; 1210 IssmDouble* xyz_list = NULL; 1211 IssmDouble dp[3]; 1212 1161 1213 /*Compute Misfit: */ 1162 for (i=0;i<elements->Size();i++){ 1163 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 1164 J+=element->ThicknessAbsGradient(); 1214 for(int i=0;i<elements->Size();i++){ 1215 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 1216 1217 /*If on water, return 0: */ 1218 if(!element->IsIceInElement()) continue; 1219 1220 /* Get node coordinates*/ 1221 element->GetVerticesCoordinates(&xyz_list); 1222 1223 /*Retrieve all inputs we will be needing: */ 1224 Input* weights_input =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 1225 Input* thickness_input =element->GetInput(ThicknessEnum); _assert_(thickness_input); 1226 1227 /* Start looping on the number of gaussian points: */ 1228 Gauss* gauss=element->NewGauss(2); 1229 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1230 1231 gauss->GaussPoint(ig); 1232 1233 /* Get Jacobian determinant: */ 1234 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 1235 1236 /*Get all parameters at gaussian point*/ 1237 weights_input->GetInputValue(&weight,gauss,ThicknessAcrossGradientEnum); 1238 thickness_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss); 1239 1240 /*Tikhonov regularization: J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */ 1241 J+=weight*1/2*(dp[0]*dp[0]+dp[1]*dp[1])*Jdet*gauss->weight; 1242 } 1243 1244 /*clean up and Return: */ 1245 xDelete<IssmDouble>(xyz_list); 1246 delete gauss; 1165 1247 } 1166 1248 -
issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp
r17972 r17976 32 32 33 33 int domaintype,numcomponents; 34 bool surfaceintegral;35 34 IssmDouble Jelem=0.; 36 35 IssmDouble misfit,Jdet; … … 47 46 element->FindParam(&domaintype,DomainTypeEnum); 48 47 switch(domaintype){ 49 case Domain2DverticalEnum: 50 surfaceintegral = true; 51 numcomponents = 1; 52 break; 53 case Domain3DEnum: 54 surfaceintegral = true; 55 numcomponents = 2; 56 break; 57 case Domain2DhorizontalEnum: 58 surfaceintegral = false; 59 numcomponents = 2; 60 break; 48 case Domain2DverticalEnum: numcomponents = 1; break; 49 case Domain3DEnum: numcomponents = 2; break; 50 case Domain2DhorizontalEnum: numcomponents = 2; break; 61 51 default: _error_("not supported yet"); 62 52 } -
issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp
r16314 r17976 10 10 void RheologyBbarAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){ 11 11 12 /*Intermediary*/13 int i;14 Element* element=NULL;15 16 12 /*output: */ 17 IssmDouble J=0 ;13 IssmDouble J=0.; 18 14 IssmDouble J_sum; 19 15 20 16 /*Compute Misfit: */ 21 for (i=0;i<elements->Size();i++){22 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));23 J+= element->RheologyBbarAbsGradient();17 for(int i=0;i<elements->Size();i++){ 18 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 19 J+=RheologyBbarAbsGradient(element); 24 20 } 25 21 … … 32 28 *pJ=J; 33 29 } 30 31 IssmDouble RheologyBbarAbsGradient(Element* element){ 32 33 int domaintype,numcomponents; 34 IssmDouble Jelem=0.; 35 IssmDouble misfit,Jdet; 36 IssmDouble dp[2],weight; 37 IssmDouble* xyz_list = NULL; 38 39 /*Get basal element*/ 40 if(!element->IsOnBase()) return 0.; 41 42 /*If on water, return 0: */ 43 if(!element->IsIceInElement()) return 0.; 44 45 /*Get problem dimension*/ 46 element->FindParam(&domaintype,DomainTypeEnum); 47 switch(domaintype){ 48 case Domain2DverticalEnum: numcomponents = 1; break; 49 case Domain3DEnum: numcomponents = 2; break; 50 case Domain2DhorizontalEnum: numcomponents = 2; break; 51 default: _error_("not supported yet"); 52 } 53 54 /*Spawn basal element*/ 55 Element* basalelement = element->SpawnBasalElement(); 56 57 /* Get node coordinates*/ 58 basalelement->GetVerticesCoordinates(&xyz_list); 59 60 /*Retrieve all inputs we will be needing: */ 61 Input* weights_input=basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 62 Input* rheologyb_input=basalelement->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input); 63 64 /* Start looping on the number of gaussian points: */ 65 Gauss* gauss=basalelement->NewGauss(2); 66 for(int ig=gauss->begin();ig<gauss->end();ig++){ 67 68 gauss->GaussPoint(ig); 69 70 /* Get Jacobian determinant: */ 71 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 72 73 /*Get all parameters at gaussian point*/ 74 weights_input->GetInputValue(&weight,gauss,RheologyBbarAbsGradientEnum); 75 rheologyb_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss); 76 77 /*Tikhonov regularization: J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */ 78 Jelem+=weight*1/2*(dp[0]*dp[0] + dp[1]*dp[1])*Jdet*gauss->weight; 79 } 80 81 /*clean up and Return: */ 82 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 83 xDelete<IssmDouble>(xyz_list); 84 delete gauss; 85 return Jelem; 86 } -
issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.h
r16314 r17976 10 10 /* local prototypes: */ 11 11 void RheologyBbarAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters); 12 IssmDouble RheologyBbarAbsGradient(Element* element); 12 13 13 14 #endif -
issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp
r17972 r17976 32 32 33 33 int domaintype,numcomponents; 34 bool surfaceintegral;35 34 IssmDouble Jelem=0.; 36 35 IssmDouble misfit,Jdet; … … 47 46 element->FindParam(&domaintype,DomainTypeEnum); 48 47 switch(domaintype){ 49 case Domain2DverticalEnum: 50 surfaceintegral = true; 51 numcomponents = 1; 52 break; 53 case Domain3DEnum: 54 surfaceintegral = true; 55 numcomponents = 2; 56 break; 57 case Domain2DhorizontalEnum: 58 surfaceintegral = false; 59 numcomponents = 2; 60 break; 48 case Domain2DverticalEnum: numcomponents = 1; break; 49 case Domain3DEnum: numcomponents = 2; break; 50 case Domain2DhorizontalEnum: numcomponents = 2; break; 61 51 default: _error_("not supported yet"); 62 52 } -
issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp
r16314 r17976 11 11 void SurfaceAverageVelMisfitx(IssmDouble* pJ,FemModel* femmodel){ 12 12 13 /*Intermediary*/14 Element* element=NULL;15 16 13 /*output: */ 17 IssmDouble J =0.;14 IssmDouble J=0.; 18 15 IssmDouble J_sum; 19 20 /*Compute surface area and add to elements inputs */21 SurfaceAreax(NULL,femmodel);22 16 23 17 /*Compute Misfit: */ 24 18 for(int i=0;i<femmodel->elements->Size();i++){ 25 element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));26 J+= element->SurfaceAverageVelMisfit();19 Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i)); 20 J+=SurfaceAverageVelMisfit(element); 27 21 } 28 22 … … 35 29 *pJ=J; 36 30 } 31 32 IssmDouble SurfaceAverageVelMisfit(Element* element){ 33 34 int domaintype,numcomponents; 35 IssmDouble Jelem=0.; 36 IssmDouble misfit,S,Jdet; 37 IssmDouble vx,vy,vxobs,vyobs,weight; 38 IssmDouble* xyz_list = NULL; 39 40 /*Get basal element*/ 41 if(!element->IsOnSurface()) return 0.; 42 43 /*If on water, return 0: */ 44 if(!element->IsIceInElement()) return 0.; 45 46 /*Get problem dimension*/ 47 element->FindParam(&domaintype,DomainTypeEnum); 48 switch(domaintype){ 49 case Domain2DverticalEnum: 50 numcomponents = 1; 51 break; 52 case Domain3DEnum: 53 numcomponents = 2; 54 break; 55 case Domain2DhorizontalEnum: 56 numcomponents = 2; 57 break; 58 default: _error_("not supported yet"); 59 } 60 61 /*Spawn surface element*/ 62 Element* topelement = element->SpawnTopElement(); 63 64 /* Get node coordinates*/ 65 topelement->GetVerticesCoordinates(&xyz_list); 66 67 /*Retrieve all inputs we will be needing: */ 68 topelement->GetInputValue(&S,SurfaceAreaEnum); 69 Input* weights_input=topelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 70 Input* vx_input =topelement->GetInput(VxEnum); _assert_(vx_input); 71 Input* vxobs_input =topelement->GetInput(InversionVxObsEnum); _assert_(vxobs_input); 72 Input* vy_input = NULL; 73 Input* vyobs_input = NULL; 74 if(numcomponents==2){ 75 vy_input =topelement->GetInput(VyEnum); _assert_(vy_input); 76 vyobs_input =topelement->GetInput(InversionVyObsEnum); _assert_(vyobs_input); 77 } 78 79 /* Start looping on the number of gaussian points: */ 80 Gauss* gauss=topelement->NewGauss(3); 81 for(int ig=gauss->begin();ig<gauss->end();ig++){ 82 83 gauss->GaussPoint(ig); 84 85 /* Get Jacobian determinant: */ 86 topelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 87 88 /*Get all parameters at gaussian point*/ 89 weights_input->GetInputValue(&weight,gauss,SurfaceAverageVelMisfitEnum); 90 vx_input->GetInputValue(&vx,gauss); 91 vxobs_input->GetInputValue(&vxobs,gauss); 92 if(numcomponents==2){ 93 vy_input->GetInputValue(&vy,gauss); 94 vyobs_input->GetInputValue(&vyobs,gauss); 95 } 96 97 /*Compute SurfaceAverageVelMisfitEnum: 98 * 99 * 1 2 2 100 * J = --- sqrt( (u - u ) + (v - v ) ) 101 * S obs obs 102 */ 103 if(numcomponents==1){ 104 misfit=1/S*(vx-vxobs)*(vx-vxobs); 105 } 106 else{ 107 misfit=1/S*sqrt( pow(vx-vxobs,2) + pow(vy-vyobs,2)); 108 } 109 110 /*Add to cost function*/ 111 Jelem+=misfit*weight*Jdet*gauss->weight; 112 } 113 114 /*clean up and Return: */ 115 if(domaintype!=Domain2DhorizontalEnum){topelement->DeleteMaterials(); delete topelement;}; 116 xDelete<IssmDouble>(xyz_list); 117 delete gauss; 118 return Jelem; 119 } -
issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h
r16314 r17976 10 10 /* local prototypes: */ 11 11 void SurfaceAverageVelMisfitx(IssmDouble* pJ,FemModel* femmodel); 12 IssmDouble SurfaceAverageVelMisfit(Element* element); 12 13 13 14 #endif -
issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp
r17975 r17976 32 32 33 33 int domaintype,numcomponents; 34 bool surfaceintegral;35 34 IssmDouble Jelem=0.; 36 35 IssmDouble epsvel=2.220446049250313e-16; … … 50 49 element->FindParam(&domaintype,DomainTypeEnum); 51 50 switch(domaintype){ 52 case Domain2DverticalEnum: 53 surfaceintegral = true; 54 numcomponents = 1; 55 break; 56 case Domain3DEnum: 57 surfaceintegral = true; 58 numcomponents = 2; 59 break; 60 case Domain2DhorizontalEnum: 61 surfaceintegral = false; 62 numcomponents = 2; 63 break; 51 case Domain2DverticalEnum: numcomponents = 1; break; 52 case Domain3DEnum: numcomponents = 2; break; 53 case Domain2DhorizontalEnum: numcomponents = 2; break; 64 54 default: _error_("not supported yet"); 65 55 } -
issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp
r16314 r17976 10 10 void SurfaceLogVxVyMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){ 11 11 12 /*Intermediary*/13 int i;14 Element* element=NULL;15 16 12 /*output: */ 17 IssmDouble J=0 ;13 IssmDouble J=0.; 18 14 IssmDouble J_sum; 19 15 20 16 /*Compute Misfit: */ 21 for (i=0;i<elements->Size();i++){22 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));23 J+= element->SurfaceLogVxVyMisfit();17 for(int i=0;i<elements->Size();i++){ 18 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 19 J+=SurfaceLogVxVyMisfit(element); 24 20 } 25 21 … … 32 28 *pJ=J; 33 29 } 30 31 IssmDouble SurfaceLogVxVyMisfit(Element* element){ 32 33 int domaintype,numcomponents; 34 IssmDouble Jelem=0.; 35 IssmDouble epsvel=2.220446049250313e-16; 36 IssmDouble meanvel=3.170979198376458e-05; /*1000 m/yr*/ 37 IssmDouble misfit,Jdet; 38 IssmDouble vx,vy,vxobs,vyobs,weight; 39 IssmDouble* xyz_list = NULL; 40 41 /*Get basal element*/ 42 if(!element->IsOnSurface()) return 0.; 43 44 /*If on water, return 0: */ 45 if(!element->IsIceInElement()) return 0.; 46 47 /*Get problem dimension*/ 48 element->FindParam(&domaintype,DomainTypeEnum); 49 switch(domaintype){ 50 case Domain2DverticalEnum: numcomponents = 1; break; 51 case Domain3DEnum: numcomponents = 2; break; 52 case Domain2DhorizontalEnum: numcomponents = 2; break; 53 default: _error_("not supported yet"); 54 } 55 56 /*Spawn surface element*/ 57 Element* topelement = element->SpawnTopElement(); 58 59 /* Get node coordinates*/ 60 topelement->GetVerticesCoordinates(&xyz_list); 61 62 /*Retrieve all inputs we will be needing: */ 63 Input* weights_input=topelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 64 Input* vx_input =topelement->GetInput(VxEnum); _assert_(vx_input); 65 Input* vxobs_input =topelement->GetInput(InversionVxObsEnum); _assert_(vxobs_input); 66 Input* vy_input = NULL; 67 Input* vyobs_input = NULL; 68 if(numcomponents==2){ 69 vy_input =topelement->GetInput(VyEnum); _assert_(vy_input); 70 vyobs_input =topelement->GetInput(InversionVyObsEnum); _assert_(vyobs_input); 71 } 72 73 /* Start looping on the number of gaussian points: */ 74 Gauss* gauss=topelement->NewGauss(4); 75 for(int ig=gauss->begin();ig<gauss->end();ig++){ 76 77 gauss->GaussPoint(ig); 78 79 /* Get Jacobian determinant: */ 80 topelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 81 82 /*Get all parameters at gaussian point*/ 83 weights_input->GetInputValue(&weight,gauss,SurfaceLogVxVyMisfitEnum); 84 vx_input->GetInputValue(&vx,gauss); 85 vxobs_input->GetInputValue(&vxobs,gauss); 86 if(numcomponents==2){ 87 vy_input->GetInputValue(&vy,gauss); 88 vyobs_input->GetInputValue(&vyobs,gauss); 89 } 90 91 /*Compute SurfaceRelVelMisfit: 92 * 93 * 1 [ |u| + eps 2 |v| + eps 2 ] 94 * J = --- \bar{v}^2 | log ( ----------- ) + log ( ----------- ) | 95 * 2 [ |u |+ eps |v |+ eps ] 96 * obs obs 97 */ 98 99 if(numcomponents==1){ 100 misfit=0.5*meanvel*meanvel*pow(log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)),2); 101 } 102 else{ 103 misfit=0.5*meanvel*meanvel*( 104 pow(log((fabs(vx)+epsvel)/(fabs(vxobs)+epsvel)),2) + 105 pow(log((fabs(vy)+epsvel)/(fabs(vyobs)+epsvel)),2) ); 106 } 107 108 /*Add to cost function*/ 109 Jelem+=misfit*weight*Jdet*gauss->weight; 110 } 111 112 /*clean up and Return: */ 113 if(domaintype!=Domain2DhorizontalEnum){topelement->DeleteMaterials(); delete topelement;}; 114 xDelete<IssmDouble>(xyz_list); 115 delete gauss; 116 return Jelem; 117 } -
issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.h
r16314 r17976 10 10 /* local prototypes: */ 11 11 void SurfaceLogVxVyMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters); 12 IssmDouble SurfaceLogVxVyMisfit(Element* element); 12 13 13 14 #endif -
issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp
r17975 r17976 32 32 33 33 int domaintype,numcomponents; 34 bool surfaceintegral;35 34 IssmDouble Jelem=0.; 36 35 IssmDouble misfit,Jdet,scalex,scaley; … … 49 48 element->FindParam(&domaintype,DomainTypeEnum); 50 49 switch(domaintype){ 51 case Domain2DverticalEnum: 52 surfaceintegral = true; 53 numcomponents = 1; 54 break; 55 case Domain3DEnum: 56 surfaceintegral = true; 57 numcomponents = 2; 58 break; 59 case Domain2DhorizontalEnum: 60 surfaceintegral = false; 61 numcomponents = 2; 62 break; 50 case Domain2DverticalEnum: numcomponents = 1; break; 51 case Domain3DEnum: numcomponents = 2; break; 52 case Domain2DhorizontalEnum: numcomponents = 2; break; 63 53 default: _error_("not supported yet"); 64 54 } -
issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp
r16314 r17976 10 10 void ThicknessAbsMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){ 11 11 12 /*Intermediary*/13 int i;14 Element* element=NULL;15 16 12 /*output: */ 17 IssmDouble J=0 ;13 IssmDouble J=0.; 18 14 IssmDouble J_sum; 19 15 20 16 /*Compute Misfit: */ 21 for (i=0;i<elements->Size();i++){22 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));23 J+= element->ThicknessAbsMisfit();17 for(int i=0;i<elements->Size();i++){ 18 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 19 J+=ThicknessAbsMisfit(element); 24 20 } 25 21 … … 32 28 *pJ=J; 33 29 } 30 31 IssmDouble ThicknessAbsMisfit(Element* element){ 32 33 IssmDouble thickness,thicknessobs,weight; 34 IssmDouble Jelem=0.; 35 IssmDouble misfit,Jdet; 36 IssmDouble* xyz_list = NULL; 37 38 /*If on water, return 0: */ 39 if(!element->IsIceInElement()) return 0.; 40 41 /* Get node coordinates*/ 42 element->GetVerticesCoordinates(&xyz_list); 43 44 /*Retrieve all inputs we will be needing: */ 45 Input* weights_input =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 46 Input* thickness_input =element->GetInput(ThicknessEnum); _assert_(thickness_input); 47 Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum); _assert_(thicknessobs_input); 48 49 /* Start looping on the number of gaussian points: */ 50 Gauss* gauss=element->NewGauss(2); 51 for(int ig=gauss->begin();ig<gauss->end();ig++){ 52 53 gauss->GaussPoint(ig); 54 55 /* Get Jacobian determinant: */ 56 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 57 58 /*Get all parameters at gaussian point*/ 59 weights_input->GetInputValue(&weight,gauss,ThicknessAbsMisfitEnum); 60 thickness_input->GetInputValue(&thickness,gauss); 61 thicknessobs_input->GetInputValue(&thicknessobs,gauss); 62 63 /*Compute ThicknessAbsMisfitEnum*/ 64 Jelem+=0.5*(thickness-thicknessobs)*(thickness-thicknessobs)*weight*Jdet*gauss->weight; 65 } 66 67 /*clean up and Return: */ 68 xDelete<IssmDouble>(xyz_list); 69 delete gauss; 70 return Jelem; 71 } -
issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h
r16314 r17976 10 10 /* local prototypes: */ 11 11 void ThicknessAbsMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters); 12 IssmDouble ThicknessAbsMisfit(Element* element); 12 13 13 14 #endif -
issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp
r16314 r17976 10 10 void ThicknessAcrossGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){ 11 11 12 /*Intermediary*/13 int i;14 Element* element=NULL;15 16 12 /*output: */ 17 IssmDouble J=0 ;13 IssmDouble J=0.; 18 14 IssmDouble J_sum; 19 15 20 16 /*Compute Misfit: */ 21 for (i=0;i<elements->Size();i++){22 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));23 J+= element->ThicknessAcrossGradient();17 for(int i=0;i<elements->Size();i++){ 18 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 19 J+=ThicknessAcrossGradient(element); 24 20 } 25 21 … … 32 28 *pJ=J; 33 29 } 30 31 IssmDouble ThicknessAcrossGradient(Element* element){ 32 33 IssmDouble thickness,thicknessobs,weight; 34 IssmDouble Jelem=0.; 35 IssmDouble misfit,Jdet; 36 IssmDouble* xyz_list = NULL; 37 IssmDouble dp[3]; 38 IssmDouble vx,vy,vel; 39 40 /*If on water, return 0: */ 41 if(!element->IsIceInElement()) return 0.; 42 43 /* Get node coordinates*/ 44 element->GetVerticesCoordinates(&xyz_list); 45 46 /*Retrieve all inputs we will be needing: */ 47 Input* weights_input =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 48 Input* thickness_input =element->GetInput(ThicknessEnum); _assert_(thickness_input); 49 Input* vx_input =element->GetInput(VxEnum); _assert_(vx_input); 50 Input* vy_input =element->GetInput(VyEnum); _assert_(vy_input); 51 52 /* Start looping on the number of gaussian points: */ 53 Gauss* gauss=element->NewGauss(2); 54 for(int ig=gauss->begin();ig<gauss->end();ig++){ 55 56 gauss->GaussPoint(ig); 57 58 /* Get Jacobian determinant: */ 59 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 60 61 /*Get all parameters at gaussian point*/ 62 weights_input->GetInputValue(&weight,gauss,ThicknessAcrossGradientEnum); 63 thickness_input->GetInputValue(&thickness,gauss); 64 thickness_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss); 65 vx_input->GetInputValue(&vx,gauss); 66 vy_input->GetInputValue(&vy,gauss); 67 vel = sqrt(vx*vx+vy*vy); 68 vx = vx/(vel+1.e-9); 69 vy = vy/(vel+1.e-9); 70 71 /*J = 1/2 ( -vy*dH/dx + vx*dH/dy )^2 */ 72 Jelem+=weight*1/2*(-vy*dp[0] + vx*dp[1])*(-vy*dp[0] + vx*dp[1])*Jdet*gauss->weight; 73 } 74 75 /*clean up and Return: */ 76 xDelete<IssmDouble>(xyz_list); 77 delete gauss; 78 return Jelem; 79 } -
issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.h
r16314 r17976 10 10 /* local prototypes: */ 11 11 void ThicknessAcrossGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters); 12 IssmDouble ThicknessAcrossGradient(Element* element); 12 13 13 14 #endif -
issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp
r16314 r17976 10 10 void ThicknessAlongGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){ 11 11 12 /*Intermediary*/13 int i;14 Element* element=NULL;15 16 12 /*output: */ 17 IssmDouble J=0 ;13 IssmDouble J=0.; 18 14 IssmDouble J_sum; 19 15 20 16 /*Compute Misfit: */ 21 for (i=0;i<elements->Size();i++){22 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));23 J+= element->ThicknessAlongGradient();17 for(int i=0;i<elements->Size();i++){ 18 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 19 J+=ThicknessAlongGradient(element); 24 20 } 25 21 … … 32 28 *pJ=J; 33 29 } 30 31 IssmDouble ThicknessAlongGradient(Element* element){ 32 33 IssmDouble thickness,thicknessobs,weight; 34 IssmDouble Jelem=0.; 35 IssmDouble misfit,Jdet; 36 IssmDouble* xyz_list = NULL; 37 IssmDouble dp[3]; 38 IssmDouble vx,vy,vel; 39 40 /*If on water, return 0: */ 41 if(!element->IsIceInElement()) return 0.; 42 43 /* Get node coordinates*/ 44 element->GetVerticesCoordinates(&xyz_list); 45 46 /*Retrieve all inputs we will be needing: */ 47 Input* weights_input =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 48 Input* thickness_input =element->GetInput(ThicknessEnum); _assert_(thickness_input); 49 Input* vx_input =element->GetInput(VxEnum); _assert_(vx_input); 50 Input* vy_input =element->GetInput(VyEnum); _assert_(vy_input); 51 52 /* Start looping on the number of gaussian points: */ 53 Gauss* gauss=element->NewGauss(2); 54 for(int ig=gauss->begin();ig<gauss->end();ig++){ 55 56 gauss->GaussPoint(ig); 57 58 /* Get Jacobian determinant: */ 59 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 60 61 /*Get all parameters at gaussian point*/ 62 weights_input->GetInputValue(&weight,gauss,ThicknessAlongGradientEnum); 63 thickness_input->GetInputValue(&thickness,gauss); 64 thickness_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss); 65 vx_input->GetInputValue(&vx,gauss); 66 vy_input->GetInputValue(&vy,gauss); 67 vel = sqrt(vx*vx+vy*vy); 68 vx = vx/(vel+1.e-9); 69 vy = vy/(vel+1.e-9); 70 71 /*J = 1/2 ( vx*dH/dx + vy*dH/dy )^2 */ 72 Jelem+=weight*1/2*(vx*dp[0] + vy*dp[1])*(vx*dp[0] + vy*dp[1])*Jdet*gauss->weight; 73 } 74 75 /*clean up and Return: */ 76 xDelete<IssmDouble>(xyz_list); 77 delete gauss; 78 return Jelem; 79 } -
issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.h
r16314 r17976 10 10 /* local prototypes: */ 11 11 void ThicknessAlongGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters); 12 IssmDouble ThicknessAlongGradient(Element* element); 12 13 13 14 #endif
Note:
See TracChangeset
for help on using the changeset viewer.