Changeset 24714


Ignore:
Timestamp:
04/16/20 21:30:20 (5 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added new implementation of Dirichlet condition with zeroing rows and 1 on diagonal

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp

    r24713 r24714  
    88#include "../modules/modules.h"
    99#include "../analyses/analyses.h"
     10#define USEPENALTYMETHOD false
    1011
    1112#ifdef _HAVE_PETSC_
     
    9495                MatRestoreRow(D,row,&ncols2,(const int**)&cols2,(const double**)&vals2);
    9596        }
    96 
    97         /*Broadcast max(dmax)*/
    98         IssmDouble dmax_all;
    99         ISSM_MPI_Reduce(&dmax,&dmax_all,1,ISSM_MPI_DOUBLE,ISSM_MPI_MAX,0,IssmComm::GetComm() );
    100         ISSM_MPI_Bcast(&dmax_all,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
    101         dmax = dmax_all;
    102 
    103         /*Penalize Dirichlet boundary*/
    104         dmax = dmax * 1.e+3;
    105         for(int i=0;i<femmodel->constraints->Size();i++){
    106                 Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
    107                 constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
    108                 if(dof!=-1){
    109                         MatSetValue(LHS,dof,dof,dmax,INSERT_VALUES);
    110                 }
     97        MatAssemblyBegin(LHS,MAT_FINAL_ASSEMBLY);
     98        MatAssemblyEnd(  LHS,MAT_FINAL_ASSEMBLY);
     99
     100        /*Deal with Dirichlet conditions: 2 options, penalties or zeros in K matrix*/
     101        if(USEPENALTYMETHOD){
     102                /*Option 1: Penalty method*/
     103
     104                /*Broadcast max(dmax)*/
     105                IssmDouble dmax_all;
     106                ISSM_MPI_Reduce(&dmax,&dmax_all,1,ISSM_MPI_DOUBLE,ISSM_MPI_MAX,0,IssmComm::GetComm() );
     107                ISSM_MPI_Bcast(&dmax_all,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
     108                dmax = dmax_all;
     109
     110                dmax = dmax * 1.e+3;
     111                for(int i=0;i<femmodel->constraints->Size();i++){
     112                        Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
     113                        constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
     114                        if(dof!=-1){
     115                                MatSetValue(LHS,dof,dof,dmax,INSERT_VALUES);
     116                        }
     117                }
     118        }
     119        else{
     120                /*Option 2: zero stiffness matrix, 1 one diagonal*/
     121                int numrows = femmodel->constraints->Size();
     122                int* rows = xNew<int>(numrows);
     123                IssmDouble* rows_spc = xNew<IssmDouble>(numrows);
     124                numrows = 0;
     125
     126                dmax = dmax * 1.e+3;
     127                for(int i=0;i<femmodel->constraints->Size();i++){
     128                        Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
     129                        constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
     130                        if(dof!=-1){
     131                                rows[numrows] = dof;
     132                                numrows++;
     133                        }
     134                }
     135                MatZeroRows(LHS,numrows,rows,1.,NULL,NULL);
     136                xDelete<int>(rows);
     137                xDelete<IssmDouble>(rows_spc);
    111138        }
    112139        MatAssemblyBegin(LHS,MAT_FINAL_ASSEMBLY);
     
    146173        VecFree(&Du);
    147174
    148         /*Penalize Dirichlet boundary*/
    149         for(int i=0;i<femmodel->constraints->Size();i++){
    150                 Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
    151                 constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
    152                 d = d*dmax;
    153                 if(dof!=-1){
    154                         VecSetValues(RHS,1,&dof,(const double*)&d,INSERT_VALUES);
    155                 }
     175        VecAssemblyBegin(RHS);
     176        VecAssemblyEnd(  RHS);
     177
     178        /*Deal with Dirichlet conditions: 2 options, penalties or zeros in K matrix*/
     179        if(USEPENALTYMETHOD){
     180                /*Option 1: Penalty method*/
     181                for(int i=0;i<femmodel->constraints->Size();i++){
     182                        Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
     183                        constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
     184                        d = d*dmax;
     185                        if(dof!=-1){
     186                                VecSetValues(RHS,1,&dof,(const double*)&d,INSERT_VALUES);
     187                        }
     188                }
     189        }
     190        else{
     191                /*Option 2: zero stiffness matrix, 1 one diagonal*/
     192                int  numrows = femmodel->constraints->Size();
     193                int* rows = xNew<int>(numrows);
     194                IssmDouble* rows_spc = xNew<IssmDouble>(numrows);
     195                numrows = 0;
     196                for(int i=0;i<femmodel->constraints->Size();i++){
     197                        Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
     198                        constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
     199                        if(dof!=-1){
     200                                rows[numrows] = dof;
     201                                rows_spc[numrows] = d;
     202                                numrows++;
     203                        }
     204                }
     205                VecSetValues(RHS,numrows,rows,rows_spc,INSERT_VALUES);
     206                xDelete<int>(rows);
     207                xDelete<IssmDouble>(rows_spc);
    156208        }
    157209        VecAssemblyBegin(RHS);
Note: See TracChangeset for help on using the changeset viewer.