Changeset 27666


Ignore:
Timestamp:
03/29/23 12:25:50 (2 years ago)
Author:
Mathieu Morlighem
Message:

NEW: better marshalling of independent variables

Location:
issm/trunk-jpl/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/IoModel.cpp

    r27490 r27666  
    480480                this->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects");
    481481                if(num_independent_objects){
    482                         this->FetchData(&names,&temp,"md.autodiff.independent_object_names");
    483                         _assert_(temp==num_independent_objects);
    484                         this->FetchData(&types,NULL,NULL,"md.autodiff.independent_object_types");
     482                        this->FetchMultipleData(&names,&temp,"md.autodiff.independent_name"); _assert_(temp==num_independent_objects);
     483                        this->FetchMultipleData(&types,NULL,"md.autodiff.independent_type");
    485484
    486485                        /*create independent objects, and at the same time, fetch the corresponding independent variables,
  • issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp

    r27387 r27666  
    475475
    476476                        /*Retrieve objective functions independently*/
    477                         _printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
     477                        _printf0_("f(x) = "<<setw(9)<<setprecision(4)<<*pf<<"  |  ");
    478478                        _printf0_("            N/A |\n");
    479                         for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[(*Jlisti)*JlistN+i]);
     479                        for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(8)<<setprecision(3)<<Jlist[(*Jlisti)*JlistN+i]);
    480480                        _printf0_("\n");
    481481
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp

    r27665 r27666  
    7575
    7676                        /*Step 1: create controls (independents)*/
    77                         iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects"); _assert_(num_independent_objects>0);
    78                         iomodel->FetchData(&names,&M,"md.autodiff.independent_object_names");               _assert_(M==num_independent_objects);
     77                        iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects");  _assert_(num_independent_objects>0);
     78                        iomodel->FetchMultipleData(&names,&M,"md.autodiff.independent_name");                _assert_(M==num_independent_objects);
     79                        iomodel->FetchMultipleData(&control_scaling_factors,&M,"md.autodiff.independent_scaling_factor"); _assert_(M==num_independent_objects);
    7980                        int* ind_enums=xNew<int>(num_independent_objects);
    8081                        for(int i=0;i<num_independent_objects;i++){
     
    8384                        }
    8485                        xDelete<char*>(names);
     86                        parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_independent_objects));
    8587                        parameters->AddObject(new IntVecParam(InversionControlParametersEnum,ind_enums,num_independent_objects));
    8688                        xDelete<int>(ind_enums);       
    87 
    88                         iomodel->FetchData(&control_scaling_factors,NULL,NULL,"md.autodiff.independent_scaling_factors");
    89                         parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_independent_objects));
    9089
    9190                        /*Step 2: create cost functions (dependent)*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp

    r26468 r27666  
    211211        #if defined(_HAVE_AD_)
    212212        /*Intermediaries*/
    213         int                             num_independent_objects,M,N,M_par,N_par;
    214         char**                  names                   = NULL;
    215         int*                            types                                                   = NULL;
    216         int*                            control_sizes                           = NULL;
    217         IssmDouble*             independent                                     = NULL;
    218         IssmDouble*             independents_fullmin    = NULL;
    219         IssmDouble*             independents_fullmax            = NULL;
    220         bool                            control_analysis                        =false;
     213        int          num_independent_objects,M,N;
     214        char       **names                = NULL;
     215        int         *types                = NULL;
     216        int         *control_sizes        = NULL;
     217        IssmDouble  *independent          = NULL;
     218        IssmDouble **independents_fullmin = NULL;
     219        IssmDouble **independents_fullmax = NULL;
     220        bool         control_analysis     = false;
    221221
    222222        iomodel->FindConstant(&control_analysis,"md.inversion.iscontrol");
     
    226226
    227227        /*Step1: create controls (independents)*/
    228         iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects");
    229         _assert_(num_independent_objects>0);
    230         iomodel->FetchData(&names,&M,"md.autodiff.independent_object_names");
    231         _assert_(M==num_independent_objects);
    232         iomodel->FetchData(&types,NULL,NULL,"md.autodiff.independent_object_types");
     228        iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects"); _assert_(num_independent_objects>0);
     229        iomodel->FetchMultipleData(&names,&M,"md.autodiff.independent_name"); _assert_(M==num_independent_objects);
     230        iomodel->FetchMultipleData(&types,&M,"md.autodiff.independent_type"); _assert_(M==num_independent_objects);
    233231
    234232        int* M_all = xNew<int>(num_independent_objects);
     
    238236        /*create independent objects, and at the same time, fetch the corresponding independent variables,
    239237         *and declare them as such in ADOLC: */
    240         iomodel->FetchData(&independents_fullmin,&M_par,&N_par,"md.autodiff.independent_min_parameters");
    241         iomodel->FetchData(&independents_fullmax,&M_par,&N_par,"md.autodiff.independent_max_parameters");
    242         iomodel->FetchData(&control_sizes,NULL,NULL,"md.autodiff.independent_control_sizes");
    243 
    244         int* start_point = NULL;
    245         start_point = xNew<int>(num_independent_objects);
    246         int counter = 0;
    247         for(int i=0;i<num_independent_objects;i++){
    248                 start_point[i]=counter;
    249                 counter+=control_sizes[i];
    250         }
     238        iomodel->FetchMultipleData(&independents_fullmin,&M_all,&N_all,&M,"md.autodiff.independent_min_parameters"); _assert_(M==num_independent_objects);
     239        iomodel->FetchMultipleData(&independents_fullmax,NULL  ,NULL  ,&M,"md.autodiff.independent_max_parameters"); _assert_(M==num_independent_objects);
     240        iomodel->FetchMultipleData(&control_sizes,&M,"md.autodiff.independent_control_size");                        _assert_(M==num_independent_objects);
    251241
    252242        for(int i=0;i<num_independent_objects;i++){
     
    257247                        char* iofieldname  = NULL;
    258248                        int   input_enum;
    259                         IssmDouble*     independents_min                        = NULL;
    260                         IssmDouble*        independents_max                     = NULL;
     249                        IssmDouble* independents_min = NULL;
     250                        IssmDouble*     independents_max = NULL;
    261251
    262252                        FieldAndEnumFromCode(&input_enum,&iofieldname,names[i]);
     
    264254                        /*Fetch required data*/
    265255                        iomodel->FetchData(&independent,&M,&N,iofieldname);
    266                         _assert_(independent);
    267                         _assert_(N==control_sizes[i]);
     256                        _assert_(independent && N==control_sizes[i]);
    268257
    269258                        independents_min = NULL; independents_min = xNew<IssmDouble>(M*N);
     
    271260                        for(int m=0;m<M;m++){
    272261                                for(int n=0;n<N;n++){
    273                                         independents_min[N*m+n]=independents_fullmin[N_par*m+start_point[i]+n];
    274                                         independents_max[N*m+n]=independents_fullmax[N_par*m+start_point[i]+n];
     262                                        independents_min[N*m+n]=independents_fullmin[i][N*m+n];
     263                                        independents_max[N*m+n]=independents_fullmax[i][N*m+n];
    275264                                }
    276265                        }
    277266                        if(N!=1) M_all[i]=M-1;
    278                         else M_all[i]=M;
    279267
    280268                        if(M_all[i]==iomodel->numberofvertices){
     
    287275                                _error_("Control size not supported");
    288276                        }
    289                         N_all[i] = N;
    290277
    291278                        for(Object* & object : elements->objects){
     
    318305        xDelete<IssmDouble>(independents_fullmin);
    319306        xDelete<IssmDouble>(independents_fullmax);
    320         xDelete<int>(start_point);
    321307        xDelete<int>(control_sizes);
    322         /*Step2: create cost functions (dependents)*/
    323308
    324309        return;
  • issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp

    r27593 r27666  
    2626                const char* field = "md.materials.rheology_B";
    2727                input_enum        = MaterialsRheologyBEnum;
     28                fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1));
     29        }
     30        else if(strcmp(string_in,"MaterialsRheologyN")==0){
     31                const char* field = "md.materials.rheology_n";
     32                input_enum        = MaterialsRheologyNEnum;
    2833                fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1));
    2934        }
  • issm/trunk-jpl/src/m/classes/autodiff.m

    r27662 r27666  
    130130                        num_independent_objects=numel(self.independents);
    131131                        WriteData(fid,prefix,'data',num_independent_objects,'name','md.autodiff.num_independent_objects','format','Integer');
    132 
    133                         if(num_independent_objects),
    134                                 names=cell(num_independent_objects,1);
    135                                 types=zeros(num_independent_objects,1);
    136 
    137                                 max_parameters_pre = [];
    138                                 min_parameters_pre = [];
    139                                 M_size = false;
    140                                 for i=1:num_independent_objects,
    141                                         indep=self.independents{i};
    142                                         if M_size == false && indep.control_size>1
    143                                                 M_size = true;
    144                                         end
    145                                 end
    146 
    147                                 for i=1:num_independent_objects,
    148                                         indep=self.independents{i};
    149 
    150                                         names{i}=indep.name;
    151                                         types(i)=indep.typetoscalar();
    152                                        
    153                                         if indep.control_size == 1 && M_size == true
    154                                                 indep.min_parameters = [indep.min_parameters;NaN];
    155                                                 indep.max_parameters = [indep.max_parameters;NaN];
    156                                         end
    157                                         min_parameters_pre=[min_parameters_pre,indep.min_parameters];
    158                                         max_parameters_pre=[max_parameters_pre,indep.max_parameters];
    159                                         scaling_factors(i)=indep.control_scaling_factor;
    160                                         control_sizes(i) = indep.control_size;
    161 
    162                                 end
    163 
    164                                 max_parameters=reshape(max_parameters_pre,size(max_parameters_pre,1),sum(control_sizes));
    165                                 min_parameters=reshape(min_parameters_pre,size(min_parameters_pre,1),sum(control_sizes));
    166 
    167                                 WriteData(fid,prefix,'data',names,'name','md.autodiff.independent_object_names','format','StringArray');
    168                                 WriteData(fid,prefix,'data',types,'name','md.autodiff.independent_object_types','format','IntMat','mattype',3);
    169                                 WriteData(fid,prefix,'data',min_parameters,'name','md.autodiff.independent_min_parameters','format','DoubleMat','mattype',3);
    170                  WriteData(fid,prefix,'data',max_parameters,'name','md.autodiff.independent_max_parameters','format','DoubleMat','mattype',3);
    171                  WriteData(fid,prefix,'data',scaling_factors,'name','md.autodiff.independent_scaling_factors','format','IntMat','mattype',3);
    172                                 WriteData(fid,prefix,'data',control_sizes,'name','md.autodiff.independent_control_sizes','format','IntMat','mattype',3);
    173 
     132                        for i=1:num_independent_objects
     133                                indep=self.independents{i};
     134                                WriteData(fid,prefix,'data',indep.name,'name','md.autodiff.independent_name','format','String');
     135                                WriteData(fid,prefix,'data',indep.typetoscalar(),'name','md.autodiff.independent_type','format','Integer');
     136                                WriteData(fid,prefix,'data',indep.min_parameters,'name','md.autodiff.independent_min_parameters','format','DoubleMat','mattype',3);
     137                                WriteData(fid,prefix,'data',indep.max_parameters,'name','md.autodiff.independent_max_parameters','format','DoubleMat','mattype',3);
     138                                WriteData(fid,prefix,'data',indep.control_scaling_factor,'name','md.autodiff.independent_scaling_factor','format','Double');
     139                                WriteData(fid,prefix,'data',indep.control_size,'name','md.autodiff.independent_control_size','format','Integer');
    174140                        end
    175141                        %}}}
Note: See TracChangeset for help on using the changeset viewer.