Ignore:
Timestamp:
08/10/09 17:16:00 (16 years ago)
Author:
Eric.Larour
Message:

Added rifts formulation, in diagnostic 2d

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp

    r786 r1628  
    1616void    CreateLoadsDiagnosticHoriz(DataSet** ploads, Model* model,ConstDataHandle model_handle){
    1717
    18         int i,j,counter;
     18        int i;
    1919        int element;
    2020
     
    2424        DataSet*    loads    = NULL;
    2525        Icefront*   icefront = NULL;
    26         Penpair*    penpair  = NULL;
     26        Riftfront*  riftfront= NULL;
    2727
    2828        int segment_width;
     
    3030        int i1,i2,i3,i4;
    3131        int i0,range;
    32         int grid1,grid2;
    33 
    34         /*rift penpair: */
    35         double  normal[2];
    36         double  length;
    37         double  friction;
    38         int     fill;
     32
    3933               
    4034        /*icefront intermediary data: */
     
    4842        double  icefront_b[MAX_ICEFRONT_GRIDS];
    4943
    50         /*penpair intermediary data: */
    51         int penpair_id;
    52         int penpair_node_ids[2];
    53         double penpair_penalty_offset;
    54         int penpair_numdofs;
    55         int penpair_dof;
    56         int penpair_penalty_lock;
    57         int penpair_element_ids[2];
    58         double penpair_friction;
    59         int penpair_fill;
    60         double penpair_normal[2];
    61         double penpair_length;
    62 
    63         /*Rifts:*/
    64         int* riftsnumpenaltypairs=NULL;
    65         double** riftspenaltypairs=NULL;
    66         int* riftsfill=NULL;
    67         int* riftsfriction=NULL;
    68         double* riftpenaltypairs=NULL;
     44        /*rifts: */
     45        char riftfront_type[RIFTFRONTSTRING];
     46        int  riftfront_id;
     47        int  riftfront_node_ids[2];
     48        int  riftfront_mparid;
     49        double riftfront_h[2];
     50        double riftfront_b[2];
     51        double riftfront_s[2];
     52        double riftfront_normal[2];
     53        double riftfront_length;
     54        int    riftfront_fill;
     55        double riftfront_friction;
     56        bool   riftfront_shelf;
     57        double riftfront_penalty_offset;
     58        int riftfront_penalty_lock;
     59        bool riftfront_active;
     60        int  riftfront_counter;
     61        bool riftfront_prestable;
    6962        int el1,el2;
     63        int grid1,grid2;
     64        double normal[2];
     65        double length;
     66        int    fill;
     67        double friction;
    7068       
    7169        /*Create loads: */
     
    153151        xfree((void**)&model->bed);
    154152
    155         counter=0;
    156 
    157153        /*Create penpair loads also for rift grids, so that they don't penetrate one another, if needed: */
    158154        /*First fetch rifts: */
     155        ModelFetchData((void**)&model->riftinfo,&model->numrifts,NULL,model_handle,"riftinfo","Matrix","Mat");
     156        ModelFetchData((void**)&model->thickness,NULL,NULL,model_handle,"thickness","Matrix","Mat");
     157        ModelFetchData((void**)&model->bed,NULL,NULL,model_handle,"bed","Matrix","Mat");
     158        ModelFetchData((void**)&model->surface,NULL,NULL,model_handle,"surface","Matrix","Mat");
     159        ModelFetchData((void**)&model->gridoniceshelf,NULL,NULL,model_handle,"gridoniceshelf","Matrix","Mat");
     160
    159161        if(model->numrifts){
    160 
    161162                for(i=0;i<model->numrifts;i++){
    162                         riftpenaltypairs=model->riftspenaltypairs[i];
    163                         for(j=0;j<model->riftsnumpenaltypairs[i];j++){
    164 
    165                                 el1=(int)*(riftpenaltypairs+7*j+2);
    166                                 #ifdef _PARALLEL_
    167                                 if (model->epart[el1-1]!=my_rank){
    168                                         /*This load does not belong to this cluster node, as it references an element
    169                                          *that does not belong to this node's partition. Drop this 'j':*/
    170                                         continue;
    171                                 }
    172                                 #endif
    173 
    174                                 /*Ok, retrieve all the data needed to add a penalty between the two grids: */
    175                                 el2=(int)*(riftpenaltypairs+7*j+3);
    176                                 grid1=(int)*(riftpenaltypairs+7*j+0);
    177                                 grid2=(int)*(riftpenaltypairs+7*j+1);
    178                                 normal[0]=*(riftpenaltypairs+7*j+4);
    179                                 normal[1]=*(riftpenaltypairs+7*j+5);
    180                                 length=*(riftpenaltypairs+7*j+6);
    181                                 friction=model->riftsfriction[i];
    182                                 fill=model->riftsfill[i];
    183 
    184                                 penpair_id=counter+1; //matlab indexing
    185                                 penpair_node_ids[0]=grid1;
    186                                 penpair_node_ids[1]=grid2;
    187                                 penpair_element_ids[0]=el1;
    188                                 penpair_element_ids[1]=el2;
    189                                 penpair_penalty_offset=model->penalty_offset;
    190                                 penpair_penalty_lock=model->penalty_lock;
    191                                 penpair_numdofs=2;
    192                                 penpair_normal[0]=normal[0];
    193                                 penpair_normal[1]=normal[1];
    194                                 penpair_length=length;
    195                                 penpair_friction=friction;
    196                                 penpair_fill=fill;
    197 
    198                                 penpair= new Penpair(penpair_id,penpair_penalty_offset,penpair_penalty_lock,penpair_numdofs,penpair_node_ids,penpair_dof,
    199                                                 penpair_element_ids,penpair_friction,penpair_fill,penpair_normal,penpair_length);
    200163                               
    201                                 loads->AddObject(penpair);
    202 
    203                                 counter++;
     164                        el1=(int)*(model->riftinfo+9*i+2);
     165                        #ifdef _PARALLEL_
     166                        if (model->epart[el1-1]!=my_rank){
     167                                /*This load does not belong to this cluster node, as it references an element
     168                                 *that does not belong to this node's partition. Drop this 'j':*/
     169                                continue;
    204170                        }
     171                        #endif
     172
     173                        /*Ok, retrieve all the data needed to add a penalty between the two grids: */
     174                        el2=(int)*(model->riftinfo+9*i+3);
     175
     176                        grid1=(int)*(model->riftinfo+9*i+0);
     177                        grid2=(int)*(model->riftinfo+9*i+1);
     178                       
     179                        normal[0]=*(model->riftinfo+9*i+4);
     180                        normal[1]=*(model->riftinfo+9*i+5);
     181                        length=*(model->riftinfo+9*i+6);
     182                       
     183                        fill = (int)*(model->riftinfo+9*i+7);
     184                        friction=*(model->riftinfo+9*i+8);
     185       
     186                        strcpy(riftfront_type,"2d");
     187                        riftfront_id=i+1; //matlab indexing
     188                        riftfront_node_ids[0]=grid1;
     189                        riftfront_node_ids[1]=grid2;
     190                        riftfront_mparid=model->numberofelements+1; //matlab indexing
     191
     192                        riftfront_h[0]=model->thickness[grid1-1];
     193                        riftfront_h[1]=model->thickness[grid2-1];
     194
     195                        riftfront_b[0]=model->bed[grid1-1];
     196                        riftfront_b[1]=model->bed[grid2-1];
     197
     198                        riftfront_s[0]=model->surface[grid1-1];
     199                        riftfront_s[1]=model->surface[grid2-1];
     200
     201                        riftfront_normal[0]=normal[0];
     202                        riftfront_normal[1]=normal[1];
     203                        riftfront_length=length;
     204                       
     205                        riftfront_fill=fill;
     206                        riftfront_friction=friction;
     207                        riftfront_shelf=(bool)model->gridoniceshelf[grid1-1];
     208
     209                        riftfront_penalty_offset=model->penalty_offset;
     210                        riftfront_penalty_lock=model->penalty_lock;
     211
     212                        riftfront_active=0;
     213                        riftfront_counter=0;
     214                        riftfront_prestable=0;
     215                       
     216                        riftfront=new Riftfront(riftfront_type,riftfront_id, riftfront_node_ids, riftfront_mparid, riftfront_h,riftfront_b,riftfront_s,riftfront_normal,riftfront_length,riftfront_fill,riftfront_friction, riftfront_penalty_offset, riftfront_penalty_lock, riftfront_active,riftfront_counter,riftfront_prestable,riftfront_shelf);
     217
     218                        loads->AddObject(riftfront);
    205219                }
    206220        }
     221
     222        /*free ressources: */
     223        xfree((void**)&model->riftinfo);
     224        xfree((void**)&model->thickness);
     225        xfree((void**)&model->bed);
     226        xfree((void**)&model->surface);
     227        xfree((void**)&model->gridoniceshelf);
     228
     229        cleanup_and_return:
    207230
    208231        /*All our datasets are already order by ids. Set presort flag so that later on, when sorting is requested on these
     
    210233        loads->Presort();
    211234
    212 
    213         /*Free ressources:*/
    214         xfree((void**)&riftsnumpenaltypairs);
    215         for(i=0;i<model->numrifts;i++){
    216                 double* temp=riftspenaltypairs[i];
    217                 xfree((void**)&temp);
    218         }
    219         xfree((void**)&riftspenaltypairs);
    220         xfree((void**)&riftsfill);
    221         xfree((void**)&riftsfriction);
    222        
    223         cleanup_and_return:
    224 
    225235        /*Assign output pointer: */
    226236        *ploads=loads;
Note: See TracChangeset for help on using the changeset viewer.