Changeset 2355


Ignore:
Timestamp:
09/29/09 16:42:37 (15 years ago)
Author:
Mathieu Morlighem
Message:

Added max and min dampening in misfit and gradient

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/objects/Tria.cpp

    r2354 r2355  
    23942394                /*Build gradje_g_gaussian vector (actually -dJ/ddrag): */
    23952395                for (i=0;i<numgrids;i++){
    2396                         grade_g_gaussian[i]=
    2397                           -2*drag*alpha_complement*((lambda*vx+mu*vy))*Jdet*gauss_weight*l1l2l3[i]                         //standard term dJ/dki
    2398                           -numpar->cm_noisedmp*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);  // regularization term d/dki(1/2*(dk/dx)^2)
     2396
     2397                        //standard term dJ/dki
     2398                        grade_g_gaussian[i]=-2*drag*alpha_complement*((lambda*vx+mu*vy))*Jdet*gauss_weight*l1l2l3[i];
     2399
     2400                        //noise dampening d/dki(1/2*(dk/dx)^2)
     2401                        grade_g_gaussian[i]+=-numpar->cm_noisedmp*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);
     2402                       
     2403                        //min dampening
     2404                        if(drag<numpar->cm_mindmp_value){
     2405                                grade_g_gaussian[i]+=numpar->cm_mindmp_slope*Jdet*gauss_weight*l1l2l3[i];
     2406                        }
     2407
     2408                        //max dampening
     2409                        if(drag<numpar->cm_maxdmp_value){
     2410                                grade_g_gaussian[i]+= - numpar->cm_maxdmp_slope*Jdet*gauss_weight*l1l2l3[i];
     2411                        }
    23992412                }
    24002413               
     
    26192632
    26202633                        //Add regularization term
    2621                         grade_g_gaussian[i]-=numpar->cm_noisedmp*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);
     2634                        grade_g_gaussian[i]+= - numpar->cm_noisedmp*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);
     2635
     2636                        //min dampening
     2637                        if(drag<numpar->cm_mindmp_value){
     2638                                grade_g_gaussian[i]+= numpar->cm_mindmp_slope*Jdet*gauss_weight*l1l2l3[i];
     2639                        }
     2640
     2641                        //max dampening
     2642                        if(drag<numpar->cm_maxdmp_value){
     2643                                grade_g_gaussian[i]+= - numpar->cm_maxdmp_slope*Jdet*gauss_weight*l1l2l3[i];
     2644                        }
    26222645                }
    26232646
     
    26892712        double adjy_list[numgrids];
    26902713        double adjxadjy_list[numgrids][2];
     2714        double B[numgrids];
    26912715
    26922716        int    dofs1[1]={0};
     
    27252749        double  thickness;
    27262750        int     dofs[1]={0};
    2727         double  dk[NDOF2];
     2751        double  dB[NDOF2];
     2752        double  B_gauss;
    27282753       
    27292754        ParameterInputs* inputs=NULL;
     
    27472772        if(!inputs->Recover("adjoint",&adjxadjy_list[0][0],2,dofs2,numgrids,(void**)nodes)){
    27482773                throw ErrorException(__FUNCT__,"missing adjoint input parameter");
     2774        }
     2775        if(!inputs->Recover("B",&B[0],1,dofs1,numgrids,(void**)nodes)){
     2776                throw ErrorException(__FUNCT__,"parameter B not found in input");
    27492777        }
    27502778
     
    28002828                GetNodalFunctionsDerivativesBasic(&dh1dh2dh3_basic[0][0],&xyz_list[0][0],gauss_l1l2l3);
    28012829
    2802                 /*Get k derivative: dk/dx */
    2803                 GetParameterDerivativeValue(&dk[0], &k[0],&xyz_list[0][0], gauss_l1l2l3);
     2830                /*Get B derivative: dB/dx */
     2831                GetParameterDerivativeValue(&dB[0], &B[0],&xyz_list[0][0], gauss_l1l2l3);
     2832                GetParameterValue(&B_gauss, &B[0],gauss_l1l2l3);
    28042833
    28052834                /*Build gradje_g_gaussian vector (actually -dJ/dB): */
     
    28092838
    28102839                        //Add regularization term
    2811                         grade_g_gaussian[i]-=numpar->cm_noisedmp*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dk[0]+dh1dh2dh3_basic[1][i]*dk[1]);
     2840                        grade_g_gaussian[i]-=numpar->cm_noisedmp*Jdet*gauss_weight*(dh1dh2dh3_basic[0][i]*dB[0]+dh1dh2dh3_basic[1][i]*dB[1]);
     2841
     2842                        //min dampening
     2843                        if(B_gauss<numpar->cm_mindmp_value){
     2844                                grade_g_gaussian[i]+= numpar->cm_mindmp_slope*Jdet*gauss_weight*l1l2l3[i];
     2845                        }
     2846
     2847                        //max dampening
     2848                        if(B_gauss<numpar->cm_maxdmp_value){
     2849                                grade_g_gaussian[i]+= - numpar->cm_maxdmp_slope*Jdet*gauss_weight*l1l2l3[i];
     2850                        }
     2851
    28122852                }
    28132853
     
    28662906        double  gauss_weight;
    28672907        double  gauss_l1l2l3[3];
     2908        double  k_gauss;
     2909        double  B_gauss;
    28682910
    28692911        /* parameters: */
     
    29633005                #endif
    29643006               
    2965                 /*Add dampening term to misfit*/
     3007                /*Add dampening terms to misfit*/
    29663008                if (strcmp(numpar->control_type,"drag")==0){
    29673009                        if (!shelf){
     3010
     3011                                //noise dampening
    29683012                                GetParameterDerivativeValue(&dk[0], &k[0],&xyz_list[0][0], gauss_l1l2l3);
    29693013                                Jelem+=numpar->cm_noisedmp*1/2*(pow(dk[0],2)+pow(dk[1],2))*Jdet*gauss_weight;
     3014
     3015                                //min dampening
     3016                                GetParameterValue(&k_gauss, &k[0],gauss_l1l2l3);
     3017                                if(k_gauss<numpar->cm_mindmp_value){
     3018                                        Jelem+=numpar->cm_mindmp_slope*k_gauss*Jdet*gauss_weight;
     3019                                }
     3020
     3021                                //max dampening
     3022                                if(k_gauss>numpar->cm_maxdmp_value){
     3023                                        Jelem+=numpar->cm_maxdmp_slope*k_gauss*Jdet*gauss_weight;
     3024                                }
    29703025                        }
    29713026                }
     
    29743029                                throw ErrorException(__FUNCT__,"parameter B not found in input");
    29753030                        }
     3031                        //noise dampening
    29763032                        GetParameterDerivativeValue(&dB[0], &B[0],&xyz_list[0][0], gauss_l1l2l3);
    29773033                        Jelem+=numpar->cm_noisedmp*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss_weight;
     3034
     3035                        //min dampening
     3036                        GetParameterValue(&B_gauss, &B[0],gauss_l1l2l3);
     3037                        if(B_gauss<numpar->cm_mindmp_value){
     3038                                Jelem+=numpar->cm_mindmp_slope*B_gauss*Jdet*gauss_weight;
     3039                        }
     3040
     3041                        //max dampening
     3042                        if(B_gauss>numpar->cm_maxdmp_value){
     3043                                Jelem+=numpar->cm_maxdmp_slope*B_gauss*Jdet*gauss_weight;
     3044                        }
    29783045                }
    29793046                else{
Note: See TracChangeset for help on using the changeset viewer.