Changeset 8936
- Timestamp:
- 07/12/11 17:47:39 (14 years ago)
- Location:
- issm/trunk/src
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
r8934 r8936 404 404 QmuNumberOfResponsesEnum, 405 405 QmuSaveFemmodelEnum, 406 PartEnum, 406 407 IndexedEnum, 407 408 RegularEnum, … … 409 410 ScaledEnum, 410 411 NodalEnum, 411 Response DescriptorsEnum,412 ResponsedescriptorsEnum, 412 413 PetscRcEnum, 413 414 SparsityEnum, 414 415 TolXEnum, //TO BE DELETED 415 Variable DescriptorsEnum,416 VariabledescriptorsEnum, 416 417 VerboseEnum, 417 418 WaitOnLockEnum, //TO BE DELETED … … 537 538 WaitonlockEnum, 538 539 NumberOfVariablesEnum, 539 NumvariabledescriptorsEnum,540 540 NumberOfResponsesEnum, 541 NumresponsedescriptorsEnum,542 541 NpartEnum, 543 542 QmuMassFluxNumProfilesEnum -
issm/trunk/src/c/io/Disk/IoModelFetchData.cpp
r8926 r8936 215 215 *pinteger=integer; 216 216 217 } 218 /*}}}*/ 219 /*FUNCTION IoModelFetchData(double*** pmatrices,int** pmdims,int** pndims, int* pM,FILE* model_handle,int data_enum){{{1*/ 220 void IoModelFetchData(double*** pmatrices,int** pmdims,int** pndims, int* pnumrecords,FILE* model_handle,int data_enum){ 221 222 int i; 223 224 extern int my_rank; 225 extern int num_procs; 226 227 /*output: */ 228 double** matrices=NULL; 229 int* mdims=NULL; 230 int* ndims=NULL; 231 int numrecords=0; 232 233 /*intermediary: */ 234 int M,N; 235 double* matrix=NULL; 236 237 FILE* fid=NULL; 238 239 /*Set file pointer to beginning of the data: */ 240 fid=SetFilePointerToData(model_handle,data_enum); 241 242 /*Now fetch: */ 243 if(my_rank==0){ 244 if(fread(&numrecords,sizeof(int),1,fid)!=1) _error_("could not read number of records in matrix array "); 245 } 246 MPI_Bcast(&numrecords,1,MPI_INT,0,MPI_COMM_WORLD); 247 248 if(numrecords){ 249 250 /*Allocate matrices :*/ 251 matrices=(double**)xmalloc(numrecords*sizeof(double*)); 252 mdims=(int*)xmalloc(numrecords*sizeof(int)); 253 ndims=(int*)xmalloc(numrecords*sizeof(int)); 254 255 for(i=0;i<numrecords;i++){ 256 matrices[i]=NULL; 257 mdims[i]=NULL; 258 ndims[i]=NULL; 259 } 260 261 /*Loop through records and fetch matrix: */ 262 for(i=0;i<numrecords;i++){ 263 264 if(my_rank==0){ 265 if(fread(&M,sizeof(int),1,fid)!=1) _error_("%s%i%s","could not read number of rows in ",i,"th matrix of matrix array"); 266 } 267 MPI_Bcast(&M,1,MPI_INT,0,MPI_COMM_WORLD); 268 269 if(my_rank==0){ 270 if(fread(&N,sizeof(int),1,fid)!=1) _error_("%s%i%s","could not read number of columns in ",i,"th matrix of matrix array"); 271 } 272 MPI_Bcast(&N,1,MPI_INT,0,MPI_COMM_WORLD); 273 274 /*Now allocate matrix: */ 275 if(M*N){ 276 matrix=(double*)xmalloc(M*N*sizeof(double)); 277 278 /*Read matrix on node 0, then broadcast: */ 279 if(my_rank==0){ 280 if(fread(matrix,M*N*sizeof(double),1,fid)!=1) _error_("could not read matrix "); 281 } 282 283 MPI_Bcast(matrix,M*N,MPI_DOUBLE,0,MPI_COMM_WORLD); 284 } 285 286 /*Assign: */ 287 matrices[i]=matrix; 288 mdims[i]=M; 289 ndims[i]=N; 290 } 291 } 292 293 /*Assign output pointers: */ 294 *pmatrices=matrices; 295 *pmdims=mdims; 296 *pndims=ndims; 297 *pnumrecords=numrecords; 217 298 } 218 299 /*}}}*/ -
issm/trunk/src/c/io/Disk/diskio.h
r8926 r8936 21 21 void IoModelFetchData(int* pinteger,FILE* model_handle,int data_enum); 22 22 void IoModelFetchData(char*** pstrings,int* pnumstrings,FILE* model_handle,int data_enum); 23 void IoModelFetchData(double*** pmatrices,int** pmdims,int** pndims, int* pnumrecords,FILE* model_handle,int data_enum); 23 24 24 25 FILE* SetFilePointerToData(FILE* model_handle,int data_enum); -
issm/trunk/src/c/modules/EnumToStringx/EnumToStringx.cpp
r8934 r8936 354 354 case QmuNumberOfResponsesEnum : return "QmuNumberOfResponses"; 355 355 case QmuSaveFemmodelEnum : return "QmuSaveFemmodel"; 356 case PartEnum : return "Part"; 356 357 case IndexedEnum : return "Indexed"; 357 358 case RegularEnum : return "Regular"; … … 359 360 case ScaledEnum : return "Scaled"; 360 361 case NodalEnum : return "Nodal"; 361 case Response DescriptorsEnum : return "ResponseDescriptors";362 case ResponsedescriptorsEnum : return "Responsedescriptors"; 362 363 case PetscRcEnum : return "PetscRc"; 363 364 case SparsityEnum : return "Sparsity"; 364 365 case TolXEnum : return "TolX"; 365 case Variable DescriptorsEnum : return "VariableDescriptors";366 case VariabledescriptorsEnum : return "VariableDescriptors"; 366 367 case VerboseEnum : return "Verbose"; 367 368 case WaitOnLockEnum : return "WaitOnLock"; … … 478 479 case WaitonlockEnum : return "Waitonlock"; 479 480 case NumberOfVariablesEnum : return "NumberOfVariables"; 480 case NumvariabledescriptorsEnum : return "Numvariabledescriptors";481 481 case NumberOfResponsesEnum : return "NumberOfResponses"; 482 case NumresponsedescriptorsEnum : return "Numresponsedescriptors";483 482 case NpartEnum : return "Npart"; 484 483 case QmuMassFluxNumProfilesEnum : return "QmuMassFluxNumProfiles"; -
issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp
r8926 r8936 25 25 26 26 char** responsedescriptors=NULL; 27 int numresponsedescriptors; 27 28 char** variabledescriptors=NULL; 29 int numvariabledescriptors; 28 30 char* descriptor=NULL; 29 31 double* dakota_parameter=NULL; … … 39 41 /*parameters for mass flux: */ 40 42 bool qmu_mass_flux_present=false; 43 int qmu_mass_flux_num_profiles=0; 41 44 double** array=NULL; 45 int* mdims_array=NULL; 46 int* ndims_array=NULL; 47 42 48 double* matrix=NULL; 43 49 double* temp_matrix=NULL; 44 int* mdims_array=NULL;45 int* ndims_array=NULL;46 50 int M; 47 51 int temp_m,temp_n; … … 70 74 parameters->AddObject(new StringParam(QmuErrNameEnum,qmuerrname)); 71 75 /*}}}*/ 72 /*Deal with variable descriptors: {{{1*/ 73 variabledescriptors=(char**)xmalloc(iomodel->numvariabledescriptors*sizeof(char*)); 74 75 /*Fetch descriptors: logic varies if we are running parallel or serial. In parallel, qmumarshall 76 * took care of marshalling all the variable descriptors, so it's easy. In serial mode, 77 * the variables are in md.variables(md.ivar), as a strucuture: */ 78 79 for(i=0;i<iomodel->numvariabledescriptors;i++){ 80 sprintf(tag,"%s%i","variabledescriptor",i+1); 81 _error_("not yet"); 82 //IoModelFetchData(&descriptor,iomodel_handle,tag); 83 variabledescriptors[i]=descriptor; 84 } 76 /*Fetch variable descriptors: {{{1*/ 77 IoModelFetchData(&variabledescriptors,&numvariabledescriptors,iomodel_handle,VariabledescriptorsEnum); 85 78 86 79 /*Ok, we have all the variable descriptors. Build a parameter with it: */ 87 parameters->AddObject(new StringArrayParam(VariableDescriptorsEnum,variabledescriptors,iomodel->numvariabledescriptors)); 88 89 /*}}}*/ 90 /*Deal with response descriptors: {{{1*/ 91 responsedescriptors=(char**)xmalloc(iomodel->numresponsedescriptors*sizeof(char*)); 92 93 /*Fetch descriptors: */ 94 for(i=0;i<iomodel->numresponsedescriptors;i++){ 95 sprintf(tag,"%s%i","responsedescriptor",i+1); 96 _error_("not yet"); 97 //IoModelFetchData(&descriptor,iomodel_handle,tag); 98 responsedescriptors[i]=descriptor; 99 } 80 parameters->AddObject(new StringArrayParam(VariabledescriptorsEnum,variabledescriptors,numvariabledescriptors)); 81 82 /*}}}*/ 83 /*Fetch response descriptors: {{{1*/ 84 IoModelFetchData(&responsedescriptors,&numresponsedescriptors,iomodel_handle,ResponsedescriptorsEnum); 100 85 101 86 /*Ok, we have all the response descriptors. Build a parameter with it: */ 102 parameters->AddObject(new StringArrayParam(Response DescriptorsEnum,responsedescriptors,iomodel->numresponsedescriptors));87 parameters->AddObject(new StringArrayParam(ResponsedescriptorsEnum,responsedescriptors,numresponsedescriptors)); 103 88 parameters->AddObject(new IntParam(QmuNumberOfResponsesEnum,iomodel->numberofresponses)); 104 89 /*}}}*/ … … 107 92 parameters->AddObject(new IntParam(QmuNPartEnum,iomodel->qmu_npart)); 108 93 109 //IoModelFetchData(&dpart,NULL,NULL,iomodel_handle,PartEnum); 110 _error_("not yet"); 94 IoModelFetchData(&dpart,NULL,NULL,iomodel_handle,PartEnum); 111 95 112 96 if(!dpart){ … … 122 106 /*Deal with data needed because of qmu variables: {{{1*/ 123 107 124 for(i=0;i< iomodel->numvariabledescriptors;i++){108 for(i=0;i<numvariabledescriptors;i++){ 125 109 126 110 if (strncmp(variabledescriptors[i],"scaled_",7)==0){ … … 129 113 130 114 /*Recover data: */ 131 //IoModelFetchData(&dakota_parameter,NULL,NULL,iomodel_handle,StringToEnumx(tag)); 132 _error_("not yet"); 115 IoModelFetchData(&dakota_parameter,NULL,NULL,iomodel_handle,StringToEnumx(tag)); 133 116 134 117 /*Convert units: */ … … 144 127 /*}}}*/ 145 128 /*Deal with data needed to compute qmu responses: {{{1*/ 146 for(i=0;i< iomodel->numresponsedescriptors;i++){129 for(i=0;i<numresponsedescriptors;i++){ 147 130 148 131 if(strncmp(responsedescriptors[i],"indexed_MassFlux",16)==0){ … … 154 137 if(qmu_mass_flux_present){ 155 138 156 /*We need the segments to be able to compute the mass flux. We have as many groups of segments as we have MassFlux 157 *responses. Let's build a DoubleMatArrayParam object with the array of segments: */ 158 159 if(iomodel->qmu_mass_flux_num_profiles==0)_error_(" qmu_mass_flux_num_profiles is 0, when MassFlux computations were requested!"); 160 161 array=(double**)xmalloc(iomodel->qmu_mass_flux_num_profiles*sizeof(double*)); 162 mdims_array=(int*)xmalloc(iomodel->qmu_mass_flux_num_profiles*sizeof(int)); 163 ndims_array=(int*)xmalloc(iomodel->qmu_mass_flux_num_profiles*sizeof(int)); 164 M=iomodel->qmu_mass_flux_num_profiles; 165 166 for(i=0;i<M;i++){ 167 sprintf(tag,"%s%i","qmu_mass_flux_segments",i+1); //names were created using Matlab indexing convention 168 //IoModelFetchData(&temp_matrix,&temp_m,&temp_n,iomodel_handle,tag); 169 _error_("not yet"); 170 171 /*This temp_matrix represents all the segments, for all elements. On this cpu, we only have a subset of these 172 * elements. Extract matrix, out of temp_matrix, corresponding to only our elements: */ 139 /*Fetch the mass flux segments necessary to compute the mass fluxes. Build a DoubleMatArrayParam object out of them: */ 140 IoModelFetchData(&array,&mdims_array,&ndims_array,&qmu_mass_flux_num_profiles,iomodel_handle,QmuMassFluxSegmentsEnum); 141 if(qmu_mass_flux_num_profiles==0)_error_(" qmu_mass_flux_num_profiles is 0, when MassFlux computations were requested!"); 142 143 /*Go through segments, and extract those that belong to this cpu: */ 144 for(i=0;i<qmu_mass_flux_num_profiles;i++){ 145 temp_matrix=array[i]; 146 temp_m=mdims_array[i]; 147 temp_n=ndims_array[i]; 148 173 149 m=0; 174 150 for(j=0;j<temp_m;j++){ … … 194 170 ndims_array[i]=5; 195 171 196 /*Free data: */172 /*Free temporary matrix: */ 197 173 xfree((void**)&temp_matrix); 198 174 } 199 175 200 176 /*Ok, we have an array of segments, different on every cpu. Create a DoubleMatArrayParam object with it: */ 201 parameters->AddObject(new DoubleMatArrayParam(QmuMassFluxSegmentsEnum,array, M,mdims_array,ndims_array));177 parameters->AddObject(new DoubleMatArrayParam(QmuMassFluxSegmentsEnum,array,qmu_mass_flux_num_profiles,mdims_array,ndims_array)); 202 178 203 179 /*Free data: */ … … 211 187 } 212 188 /*}}}*/ 213 214 189 parameters->AddObject(new BoolParam(QmuSaveFemmodelEnum,iomodel->qmu_save_femmodel)); 215 216 190 /*Free data: {{{1*/ 217 for(i=0;i< iomodel->numresponsedescriptors;i++){191 for(i=0;i<numresponsedescriptors;i++){ 218 192 descriptor=responsedescriptors[i]; 219 193 xfree((void**)&descriptor); … … 221 195 xfree((void**)&responsedescriptors); 222 196 223 for(i=0;i< iomodel->numvariabledescriptors;i++){197 for(i=0;i<numvariabledescriptors;i++){ 224 198 descriptor=variabledescriptors[i]; 225 199 xfree((void**)&descriptor); -
issm/trunk/src/c/modules/Qmux/SpawnCoreParallel.cpp
r8224 r8936 55 55 56 56 /*retrieve parameters: */ 57 femmodel->parameters->FindParam(&responses_descriptors,&numresponsedescriptors,Response DescriptorsEnum);57 femmodel->parameters->FindParam(&responses_descriptors,&numresponsedescriptors,ResponsedescriptorsEnum); 58 58 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum); 59 59 femmodel->parameters->FindParam(&control_analysis,ControlAnalysisEnum); -
issm/trunk/src/c/modules/StringToEnumx/StringToEnumx.cpp
r8934 r8936 352 352 else if (strcmp(name,"QmuNumberOfResponses")==0) return QmuNumberOfResponsesEnum; 353 353 else if (strcmp(name,"QmuSaveFemmodel")==0) return QmuSaveFemmodelEnum; 354 else if (strcmp(name,"Part")==0) return PartEnum; 354 355 else if (strcmp(name,"Indexed")==0) return IndexedEnum; 355 356 else if (strcmp(name,"Regular")==0) return RegularEnum; … … 357 358 else if (strcmp(name,"Scaled")==0) return ScaledEnum; 358 359 else if (strcmp(name,"Nodal")==0) return NodalEnum; 359 else if (strcmp(name,"Response Descriptors")==0) return ResponseDescriptorsEnum;360 else if (strcmp(name,"Responsedescriptors")==0) return ResponsedescriptorsEnum; 360 361 else if (strcmp(name,"PetscRc")==0) return PetscRcEnum; 361 362 else if (strcmp(name,"Sparsity")==0) return SparsityEnum; 362 363 else if (strcmp(name,"TolX")==0) return TolXEnum; 363 else if (strcmp(name,"Variable Descriptors")==0) return VariableDescriptorsEnum;364 else if (strcmp(name,"Variabledescriptors")==0) return VariabledescriptorsEnum; 364 365 else if (strcmp(name,"Verbose")==0) return VerboseEnum; 365 366 else if (strcmp(name,"WaitOnLock")==0) return WaitOnLockEnum; … … 476 477 else if (strcmp(name,"Waitonlock")==0) return WaitonlockEnum; 477 478 else if (strcmp(name,"NumberOfVariables")==0) return NumberOfVariablesEnum; 478 else if (strcmp(name,"Numvariabledescriptors")==0) return NumvariabledescriptorsEnum;479 479 else if (strcmp(name,"NumberOfResponses")==0) return NumberOfResponsesEnum; 480 else if (strcmp(name,"Numresponsedescriptors")==0) return NumresponsedescriptorsEnum;481 480 else if (strcmp(name,"Npart")==0) return NpartEnum; 482 481 else if (strcmp(name,"QmuMassFluxNumProfiles")==0) return QmuMassFluxNumProfilesEnum; -
issm/trunk/src/c/objects/IoModel.cpp
r8926 r8936 233 233 if(this->qmu_analysis){ 234 234 IoModelFetchData(&this->numberofvariables,iomodel_handle,NumberOfVariablesEnum); 235 IoModelFetchData(&this->numvariabledescriptors,iomodel_handle,NumvariabledescriptorsEnum);236 235 IoModelFetchData(&this->numberofresponses,iomodel_handle,NumberOfResponsesEnum); 237 IoModelFetchData(&this->numresponsedescriptors,iomodel_handle,NumresponsedescriptorsEnum);238 236 IoModelFetchData(&this->qmu_npart,iomodel_handle,NpartEnum); 239 IoModelFetchData(&this->qmu_mass_flux_num_profiles,iomodel_handle,QmuMassFluxNumProfilesEnum);240 237 IoModelFetchData(&this->qmu_save_femmodel,iomodel_handle,QmuSaveFemmodelEnum); 241 238 } -
issm/trunk/src/c/objects/IoModel.h
r8926 r8936 200 200 201 201 /*qmu: */ 202 int qmu_mass_flux_num_profiles;203 202 int qmu_save_femmodel; 204 203 -
issm/trunk/src/m/classes/model.m
r8932 r8936 332 332 dakotadat={'',false}; 333 333 qmu_analysis={0,true,'Integer'}; 334 part={[], false};334 part={[],true,'Mat'}; 335 335 npart={0,true,'Integer'}; 336 336 numberofvariables={0,true,'Integer'}; 337 337 numberofresponses={0,true,'Integer'}; 338 variabledescriptors={NaN,false}; 339 responsedescriptors={NaN,false}; 340 numvariabledescriptors={0,true,'Integer'}; 341 numresponsedescriptors={0,true,'Integer'}; 342 qmu_mass_flux_num_profiles={0,true,'Integer'}; 338 variabledescriptors={{},true,'StringArray'}; 339 responsedescriptors={{},true,'StringArray'}; 343 340 qmu_mass_flux_profile_directory={NaN,false}; 344 341 qmu_mass_flux_profiles={NaN,false}; 345 qmu_mass_flux_segments={ NaN,false};342 qmu_mass_flux_segments={{},true,'MatArray'}; 346 343 qmu_relax={0,false}; 347 344 qmu_save_femmodel={0,true,'Integer'}; -
issm/trunk/src/m/model/WriteData.m
r8926 r8936 40 40 %first write length of record 41 41 fwrite(fid,4,'int'); %1 integer 42 42 43 %now write integer 43 44 fwrite(fid,data,'int'); … … 50 51 51 52 %first get length of string array: 52 num=length(data); 53 53 num=numel(data); 54 54 %now get length of record: 55 55 recordlength=4; %for length of array … … 71 71 fwrite(fid,string,'char'); 72 72 end 73 elseif strcmpi(data_type,'MatArray'), 74 75 numrecords=numel(data); 76 77 %first get length of record 78 recordlength=4; %number of records= 79 for i=1:numrecords, 80 matrix=data{i}; 81 s=size(matrix); 82 recordlength=recordlength+4*2+... %row and col of matrix 83 s(1)*s(2)*8; %matrix of doubles 84 end 85 86 %write length of record 87 fwrite(fid,recordlength,'int'); 88 89 %write data, first number of records 90 fwrite(fid,numrecords,'int'); 91 92 %write each matrix: 93 for i=1:numrecords, 94 matrix=data{i}; 95 s=size(matrix); 96 fwrite(fid,s(1),'int'); 97 fwrite(fid,s(2),'int'); 98 fwrite(fid,matrix,'double'); 99 end 73 100 else 74 101 error('WriteData error message: data type not supported yet!'); -
issm/trunk/src/m/model/solve.m
r8577 r8936 59 59 marshall(md); 60 60 61 %add qmu fields to binary file if running qmu analysis62 if md.qmu_analysis,63 qmumarshall(md,md.variables(options.ivar),md.responses(options.iresp));64 end65 61 66 62 %write a template file for issm to use, in parallel -
issm/trunk/src/m/qmu/preqmu.m
r6860 r8936 103 103 md.variabledescriptors=variabledescriptors; 104 104 md.responsedescriptors=responsedescriptors; 105 md.numvariabledescriptors=numel(md.variabledescriptors);106 md.numresponsedescriptors=numel(md.responsedescriptors);107 105 108 106 %now, we have to provide all the info necessary for the solutions to compute the responses. For ex, if mass_flux -
issm/trunk/src/m/qmu/process_qmu_response_data.m
r5487 r8936 43 43 end 44 44 45 %ok, process the domains named in qmu_mass_flux_profiles, to build a list of segments 45 %ok, process the domains named in qmu_mass_flux_profiles, to build a list of segments (MatArray) 46 46 md.qmu_mass_flux_segments=cell(num_mass_flux,1); 47 47 … … 50 50 end 51 51 52 %finally, set qmu_mass_flux_num_profiles, for future marshalling53 md.qmu_mass_flux_num_profiles=num_mass_flux;54 52 end
Note:
See TracChangeset
for help on using the changeset viewer.