mirror of
https://github.com/gentoo-mirror/guru.git
synced 2025-04-20 23:46:14 -04:00
There are no dedicated Test and Tutorials tarballs this time. The tarbals from 7.0.7 are used. Signed-off-by: Sergey Torokhov <torokhov-s-a@yandex.ru>
2213 lines
102 KiB
Diff
2213 lines
102 KiB
Diff
diff -Naur old/SU2_PY/FSI/FSIInterface.py new/SU2_PY/FSI/FSIInterface.py
|
|
--- old/SU2_PY/FSI/FSIInterface.py 2020-05-01 19:09:18.000000000 +0300
|
|
+++ new/SU2_PY/FSI/FSIInterface.py 2020-05-10 16:17:07.000000000 +0300
|
|
@@ -6,8 +6,8 @@
|
|
# \version 7.0.8 "Blackbird"
|
|
#
|
|
# SU2 Project Website: https://su2code.github.io
|
|
-#
|
|
-# The SU2 Project is maintained by the SU2 Foundation
|
|
+#
|
|
+# The SU2 Project is maintained by the SU2 Foundation
|
|
# (http://su2foundation.org)
|
|
#
|
|
# Copyright 2012-2020, SU2 Contributors (cf. AUTHORS.md)
|
|
@@ -16,7 +16,7 @@
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
-#
|
|
+#
|
|
# SU2 is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
@@ -42,19 +42,19 @@
|
|
# ----------------------------------------------------------------------
|
|
|
|
class Interface:
|
|
- """
|
|
+ """
|
|
FSI interface class that handles fluid/solid solvers synchronisation and communication
|
|
"""
|
|
-
|
|
+
|
|
def __init__(self, FSI_config, FluidSolver, SolidSolver, have_MPI):
|
|
- """
|
|
- Class constructor. Declare some variables and do some screen outputs.
|
|
- """
|
|
-
|
|
+ """
|
|
+ Class constructor. Declare some variables and do some screen outputs.
|
|
+ """
|
|
+
|
|
if have_MPI == True:
|
|
from mpi4py import MPI
|
|
self.MPI = MPI
|
|
- self.comm = MPI.COMM_WORLD #MPI World communicator
|
|
+ self.comm = MPI.COMM_WORLD #MPI World communicator
|
|
self.have_MPI = True
|
|
myid = self.comm.Get_rank()
|
|
else:
|
|
@@ -62,42 +62,42 @@
|
|
self.have_MPI = False
|
|
myid = 0
|
|
|
|
- self.rootProcess = 0 #the root process is chosen to be MPI rank = 0
|
|
+ self.rootProcess = 0 #the root process is chosen to be MPI rank = 0
|
|
|
|
- self.nDim = FSI_config['NDIM'] #problem dimension
|
|
+ self.nDim = FSI_config['NDIM'] #problem dimension
|
|
|
|
- self.haveFluidSolver = False #True if the fluid solver is initialized on the current rank
|
|
- self.haveSolidSolver = False #True if the solid solver is initialized on the current rank
|
|
- self.haveFluidInterface = False #True if the current rank owns at least one fluid interface node
|
|
- self.haveSolidInterface = False #True if the current rank owns at least one solid interface node
|
|
+ self.haveFluidSolver = False #True if the fluid solver is initialized on the current rank
|
|
+ self.haveSolidSolver = False #True if the solid solver is initialized on the current rank
|
|
+ self.haveFluidInterface = False #True if the current rank owns at least one fluid interface node
|
|
+ self.haveSolidInterface = False #True if the current rank owns at least one solid interface node
|
|
|
|
- self.fluidSolverProcessors = list() #list of partitions where the fluid solver is initialized
|
|
- self.solidSolverProcessors = list() #list of partitions where the solid solver is initialized
|
|
+ self.fluidSolverProcessors = list() #list of partitions where the fluid solver is initialized
|
|
+ self.solidSolverProcessors = list() #list of partitions where the solid solver is initialized
|
|
self.fluidInterfaceProcessors = list() #list of partitions where there are fluid interface nodes
|
|
- self.solidInterfaceProcessors = list() #list of partitions where there are solid interface nodes
|
|
+ self.solidInterfaceProcessors = list() #list of partitions where there are solid interface nodes
|
|
|
|
- self.fluidInterfaceIdentifier = None #object that can identify the f/s interface within the fluid solver
|
|
- self.solidInterfaceIdentifier = None #object that can identify the f/s interface within the solid solver
|
|
+ self.fluidInterfaceIdentifier = None #object that can identify the f/s interface within the fluid solver
|
|
+ self.solidInterfaceIdentifier = None #object that can identify the f/s interface within the solid solver
|
|
|
|
- self.fluidGlobalIndexRange = {} #contains the global FSI indexing of each fluid interface node for all partitions
|
|
- self.solidGlobalIndexRange = {} #contains the global FSI indexing of each solid interface node for all partitions
|
|
+ self.fluidGlobalIndexRange = {} #contains the global FSI indexing of each fluid interface node for all partitions
|
|
+ self.solidGlobalIndexRange = {} #contains the global FSI indexing of each solid interface node for all partitions
|
|
|
|
- self.FluidHaloNodeList = {} #contains the the indices (fluid solver indexing) of the halo nodes for each partition
|
|
- self.fluidIndexing = {} #links between the fluid solver indexing and the FSI indexing for the interface nodes
|
|
- self.SolidHaloNodeList = {} #contains the the indices (solid solver indexing) of the halo nodes for each partition
|
|
- self.solidIndexing = {} #links between the solid solver indexing and the FSI indexing for the interface nodes
|
|
-
|
|
- self.nLocalFluidInterfaceNodes = 0 #number of nodes (halo nodes included) on the fluid interface, on each partition
|
|
- self.nLocalFluidInterfaceHaloNode = 0 #number of halo nodes on the fluid intrface, on each partition
|
|
- self.nLocalFluidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the fluid interface, on each partition
|
|
- self.nFluidInterfaceNodes = 0 #number of nodes on the fluid interface, sum over all the partitions
|
|
- self.nFluidInterfacePhysicalNodes = 0 #number of physical nodes on the fluid interface, sum over all partitions
|
|
-
|
|
- self.nLocalSolidInterfaceNodes = 0 #number of physical nodes on the solid interface, on each partition
|
|
- self.nLocalSolidInterfaceHaloNode = 0 #number of halo nodes on the solid intrface, on each partition
|
|
- self.nLocalSolidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the solid interface, on each partition
|
|
- self.nSolidInterfaceNodes = 0 #number of nodes on the solid interface, sum over all partitions
|
|
- self.nSolidInterfacePhysicalNodes = 0 #number of physical nodes on the solid interface, sum over all partitions
|
|
+ self.FluidHaloNodeList = {} #contains the the indices (fluid solver indexing) of the halo nodes for each partition
|
|
+ self.fluidIndexing = {} #links between the fluid solver indexing and the FSI indexing for the interface nodes
|
|
+ self.SolidHaloNodeList = {} #contains the the indices (solid solver indexing) of the halo nodes for each partition
|
|
+ self.solidIndexing = {} #links between the solid solver indexing and the FSI indexing for the interface nodes
|
|
+
|
|
+ self.nLocalFluidInterfaceNodes = 0 #number of nodes (halo nodes included) on the fluid interface, on each partition
|
|
+ self.nLocalFluidInterfaceHaloNode = 0 #number of halo nodes on the fluid intrface, on each partition
|
|
+ self.nLocalFluidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the fluid interface, on each partition
|
|
+ self.nFluidInterfaceNodes = 0 #number of nodes on the fluid interface, sum over all the partitions
|
|
+ self.nFluidInterfacePhysicalNodes = 0 #number of physical nodes on the fluid interface, sum over all partitions
|
|
+
|
|
+ self.nLocalSolidInterfaceNodes = 0 #number of physical nodes on the solid interface, on each partition
|
|
+ self.nLocalSolidInterfaceHaloNode = 0 #number of halo nodes on the solid intrface, on each partition
|
|
+ self.nLocalSolidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the solid interface, on each partition
|
|
+ self.nSolidInterfaceNodes = 0 #number of nodes on the solid interface, sum over all partitions
|
|
+ self.nSolidInterfacePhysicalNodes = 0 #number of physical nodes on the solid interface, sum over all partitions
|
|
|
|
if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
|
|
self.MappingMatrixA = None
|
|
@@ -106,83 +106,83 @@
|
|
self.MappingMatrixB_T = None
|
|
self.d_RBF = self.nDim+1
|
|
else:
|
|
- self.MappingMatrix = None #interpolation/mapping matrix for meshes interpolation/mapping
|
|
- self.MappingMatrix_T = None #transposed interpolation/mapping matrix for meshes interpolation/mapping
|
|
+ self.MappingMatrix = None #interpolation/mapping matrix for meshes interpolation/mapping
|
|
+ self.MappingMatrix_T = None #transposed interpolation/mapping matrix for meshes interpolation/mapping
|
|
self.d_RBF = 0
|
|
|
|
- self.localFluidInterface_array_X_init = None #initial fluid interface position on each partition (used for the meshes mapping)
|
|
+ self.localFluidInterface_array_X_init = None #initial fluid interface position on each partition (used for the meshes mapping)
|
|
self.localFluidInterface_array_Y_init = None
|
|
self.localFluidInterface_array_Z_init = None
|
|
|
|
- self.haloNodesPositionsInit = {} #initial position of the halo nodes (fluid side only)
|
|
+ self.haloNodesPositionsInit = {} #initial position of the halo nodes (fluid side only)
|
|
|
|
- self.solidInterface_array_DispX = None #solid interface displacement
|
|
+ self.solidInterface_array_DispX = None #solid interface displacement
|
|
self.solidInterface_array_DispY = None
|
|
self.solidInterface_array_DispZ = None
|
|
|
|
- self.solidInterfaceResidual_array_X = None #solid interface position residual
|
|
+ self.solidInterfaceResidual_array_X = None #solid interface position residual
|
|
self.solidInterfaceResidual_array_Y = None
|
|
self.solidInterfaceResidual_array_Z = None
|
|
|
|
- self.solidInterfaceResidualnM1_array_X = None #solid interface position residual at the previous BGS iteration
|
|
+ self.solidInterfaceResidualnM1_array_X = None #solid interface position residual at the previous BGS iteration
|
|
self.solidInterfaceResidualnM1_array_Y = None
|
|
self.solidInterfaceResidualnM1_array_Z = None
|
|
-
|
|
- self.fluidInterface_array_DispX = None #fluid interface displacement
|
|
+
|
|
+ self.fluidInterface_array_DispX = None #fluid interface displacement
|
|
self.fluidInterface_array_DispY = None
|
|
self.fluidInterface_array_DispZ = None
|
|
|
|
- self.fluidLoads_array_X = None #loads on the fluid side of the f/s interface
|
|
+ self.fluidLoads_array_X = None #loads on the fluid side of the f/s interface
|
|
self.fluidLoads_array_Y = None
|
|
self.fluidLoads_array_Z = None
|
|
|
|
- self.solidLoads_array_X = None #loads on the solid side of the f/s interface
|
|
+ self.solidLoads_array_X = None #loads on the solid side of the f/s interface
|
|
self.solidLoads_array_Y = None
|
|
self.solidLoads_array_Z = None
|
|
|
|
- self.aitkenParam = FSI_config['AITKEN_PARAM'] #relaxation parameter for the BGS method
|
|
- self.FSIIter = 0 #current FSI iteration
|
|
- self.unsteady = False #flag for steady or unsteady simulation (default is steady)
|
|
-
|
|
- # ---Some screen output ---
|
|
- self.MPIPrint('Fluid solver : SU2_CFD')
|
|
- self.MPIPrint('Solid solver : {}'.format(FSI_config['CSD_SOLVER']))
|
|
+ self.aitkenParam = FSI_config['AITKEN_PARAM'] #relaxation parameter for the BGS method
|
|
+ self.FSIIter = 0 #current FSI iteration
|
|
+ self.unsteady = False #flag for steady or unsteady simulation (default is steady)
|
|
+
|
|
+ # ---Some screen output ---
|
|
+ self.MPIPrint('Fluid solver : SU2_CFD')
|
|
+ self.MPIPrint('Solid solver : {}'.format(FSI_config['CSD_SOLVER']))
|
|
|
|
- if FSI_config['TIME_MARCHING'] == 'YES':
|
|
+ if FSI_config['TIME_MARCHING'] == 'YES':
|
|
self.MPIPrint('Unsteady coupled simulation with physical time step : {} s'.format(FSI_config['UNST_TIMESTEP']))
|
|
self.unsteady = True
|
|
- else:
|
|
- self.MPIPrint('Steady coupled simulation')
|
|
+ else:
|
|
+ self.MPIPrint('Steady coupled simulation')
|
|
|
|
- if FSI_config['MATCHING_MESH'] == 'YES':
|
|
- self.MPIPrint('Matching fluid-solid interface')
|
|
- else:
|
|
+ if FSI_config['MATCHING_MESH'] == 'YES':
|
|
+ self.MPIPrint('Matching fluid-solid interface')
|
|
+ else:
|
|
if FSI_config['MESH_INTERP_METHOD'] == 'TPS':
|
|
- self.MPIPrint('Non matching fluid-solid interface with Thin Plate Spline interpolation')
|
|
+ self.MPIPrint('Non matching fluid-solid interface with Thin Plate Spline interpolation')
|
|
elif FSI_config['MESH_INTERP_METHOD'] == 'RBF':
|
|
self.MPIPrint('Non matching fluid-solid interface with Radial Basis Function interpolation')
|
|
self.RBF_rad = FSI_config['RBF_RADIUS']
|
|
- self.MPIPrint('Radius value : {}'.format(self.RBF_rad))
|
|
+ self.MPIPrint('Radius value : {}'.format(self.RBF_rad))
|
|
else:
|
|
- self.MPIPrint('Non matching fluid-solid interface with Nearest Neighboor interpolation')
|
|
+ self.MPIPrint('Non matching fluid-solid interface with Nearest Neighboor interpolation')
|
|
|
|
- self.MPIPrint('Solid predictor : {}'.format(FSI_config['DISP_PRED']))
|
|
+ self.MPIPrint('Solid predictor : {}'.format(FSI_config['DISP_PRED']))
|
|
|
|
- self.MPIPrint('Maximum number of FSI iterations : {}'.format(FSI_config['NB_FSI_ITER']))
|
|
+ self.MPIPrint('Maximum number of FSI iterations : {}'.format(FSI_config['NB_FSI_ITER']))
|
|
|
|
- self.MPIPrint('FSI tolerance : {}'.format(FSI_config['FSI_TOLERANCE']))
|
|
+ self.MPIPrint('FSI tolerance : {}'.format(FSI_config['FSI_TOLERANCE']))
|
|
|
|
- if FSI_config['AITKEN_RELAX'] == 'STATIC':
|
|
- self.MPIPrint('Static Aitken under-relaxation with constant parameter {}'.format(FSI_config['AITKEN_PARAM']))
|
|
- elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
|
|
- self.MPIPrint('Dynamic Aitken under-relaxation with initial parameter {}'.format(FSI_config['AITKEN_PARAM']))
|
|
- else:
|
|
- self.MPIPrint('No Aitken under-relaxation')
|
|
+ if FSI_config['AITKEN_RELAX'] == 'STATIC':
|
|
+ self.MPIPrint('Static Aitken under-relaxation with constant parameter {}'.format(FSI_config['AITKEN_PARAM']))
|
|
+ elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
|
|
+ self.MPIPrint('Dynamic Aitken under-relaxation with initial parameter {}'.format(FSI_config['AITKEN_PARAM']))
|
|
+ else:
|
|
+ self.MPIPrint('No Aitken under-relaxation')
|
|
|
|
self.MPIPrint('FSI interface is set')
|
|
|
|
def MPIPrint(self, message):
|
|
- """
|
|
+ """
|
|
Print a message on screen only from the master process.
|
|
"""
|
|
|
|
@@ -198,28 +198,28 @@
|
|
"""
|
|
Perform a synchronization barrier in case of parallel run with MPI.
|
|
"""
|
|
-
|
|
+
|
|
if self.have_MPI == True:
|
|
self.comm.barrier()
|
|
|
|
def connect(self, FSI_config, FluidSolver, SolidSolver):
|
|
- """
|
|
- Connection between solvers.
|
|
- Creates the communication support between the two solvers.
|
|
- Gets information about f/s interfaces from the two solvers.
|
|
- """
|
|
+ """
|
|
+ Connection between solvers.
|
|
+ Creates the communication support between the two solvers.
|
|
+ Gets information about f/s interfaces from the two solvers.
|
|
+ """
|
|
if self.have_MPI == True:
|
|
myid = self.comm.Get_rank()
|
|
- MPIsize = self.comm.Get_size()
|
|
+ MPIsize = self.comm.Get_size()
|
|
else:
|
|
myid = 0
|
|
MPIsize = 1
|
|
-
|
|
- # --- Identify the fluid and solid interfaces and store the number of nodes on both sides (and for each partition) ---
|
|
+
|
|
+ # --- Identify the fluid and solid interfaces and store the number of nodes on both sides (and for each partition) ---
|
|
self.fluidInterfaceIdentifier = None
|
|
self.nLocalFluidInterfaceNodes = 0
|
|
if FluidSolver != None:
|
|
- print('Fluid solver is initialized on process {}'.format(myid))
|
|
+ print('Fluid solver is initialized on process {}'.format(myid))
|
|
self.haveFluidSolver = True
|
|
allMovingMarkersTags = FluidSolver.GetAllMovingMarkersTag()
|
|
allMarkersID = FluidSolver.GetAllBoundaryMarkers()
|
|
@@ -229,23 +229,23 @@
|
|
if allMovingMarkersTags[0] in allMarkersID.keys():
|
|
self.fluidInterfaceIdentifier = allMarkersID[allMovingMarkersTags[0]]
|
|
if self.fluidInterfaceIdentifier != None:
|
|
- self.nLocalFluidInterfaceNodes = FluidSolver.GetNumberVertices(self.fluidInterfaceIdentifier)
|
|
- if self.nLocalFluidInterfaceNodes != 0:
|
|
+ self.nLocalFluidInterfaceNodes = FluidSolver.GetNumberVertices(self.fluidInterfaceIdentifier)
|
|
+ if self.nLocalFluidInterfaceNodes != 0:
|
|
self.haveFluidInterface = True
|
|
- print('Number of interface fluid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalFluidInterfaceNodes))
|
|
- else:
|
|
- pass
|
|
+ print('Number of interface fluid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalFluidInterfaceNodes))
|
|
+ else:
|
|
+ pass
|
|
|
|
- if SolidSolver != None:
|
|
- print('Solid solver is initialized on process {}'.format(myid))
|
|
+ if SolidSolver != None:
|
|
+ print('Solid solver is initialized on process {}'.format(myid))
|
|
self.haveSolidSolver = True
|
|
- self.solidInterfaceIdentifier = SolidSolver.getFSIMarkerID()
|
|
- self.nLocalSolidInterfaceNodes = SolidSolver.getNumberOfSolidInterfaceNodes(self.solidInterfaceIdentifier)
|
|
- if self.nLocalSolidInterfaceNodes != 0:
|
|
+ self.solidInterfaceIdentifier = SolidSolver.getFSIMarkerID()
|
|
+ self.nLocalSolidInterfaceNodes = SolidSolver.getNumberOfSolidInterfaceNodes(self.solidInterfaceIdentifier)
|
|
+ if self.nLocalSolidInterfaceNodes != 0:
|
|
self.haveSolidInterface = True
|
|
print('Number of interface solid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalSolidInterfaceNodes))
|
|
- else:
|
|
- pass
|
|
+ else:
|
|
+ pass
|
|
|
|
# --- Exchange information about processors on which the solvers are defined and where the interface nodes are lying ---
|
|
if self.have_MPI == True:
|
|
@@ -266,18 +266,18 @@
|
|
else:
|
|
sendBufSolidInterface = np.array(int(0))
|
|
rcvBufFluid = np.zeros(MPIsize, dtype = int)
|
|
- rcvBufSolid = np.zeros(MPIsize, dtype = int)
|
|
+ rcvBufSolid = np.zeros(MPIsize, dtype = int)
|
|
rcvBufFluidInterface = np.zeros(MPIsize, dtype = int)
|
|
- rcvBufSolidInterface = np.zeros(MPIsize, dtype = int)
|
|
+ rcvBufSolidInterface = np.zeros(MPIsize, dtype = int)
|
|
self.comm.Allgather(sendBufFluid, rcvBufFluid)
|
|
self.comm.Allgather(sendBufSolid, rcvBufSolid)
|
|
self.comm.Allgather(sendBufFluidInterface, rcvBufFluidInterface)
|
|
self.comm.Allgather(sendBufSolidInterface, rcvBufSolidInterface)
|
|
for iProc in range(MPIsize):
|
|
- if rcvBufFluid[iProc] == 1:
|
|
+ if rcvBufFluid[iProc] == 1:
|
|
self.fluidSolverProcessors.append(iProc)
|
|
if rcvBufSolid[iProc] == 1:
|
|
- self.solidSolverProcessors.append(iProc)
|
|
+ self.solidSolverProcessors.append(iProc)
|
|
if rcvBufFluidInterface[iProc] == 1:
|
|
self.fluidInterfaceProcessors.append(iProc)
|
|
if rcvBufSolidInterface[iProc] == 1:
|
|
@@ -285,19 +285,19 @@
|
|
del sendBufFluid, sendBufSolid, rcvBufFluid, rcvBufSolid, sendBufFluidInterface, sendBufSolidInterface, rcvBufFluidInterface, rcvBufSolidInterface
|
|
else:
|
|
self.fluidSolverProcessors.append(0)
|
|
- self.solidSolverProcessors.append(0)
|
|
+ self.solidSolverProcessors.append(0)
|
|
self.fluidInterfaceProcessors.append(0)
|
|
self.solidInterfaceProcessors.append(0)
|
|
|
|
- self.MPIBarrier()
|
|
-
|
|
- # --- Calculate the total number of nodes at the fluid interface (sum over all the partitions) ---
|
|
+ self.MPIBarrier()
|
|
+
|
|
+ # --- Calculate the total number of nodes at the fluid interface (sum over all the partitions) ---
|
|
# Calculate the number of halo nodes on each partition
|
|
self.nLocalFluidInterfaceHaloNode = 0
|
|
- for iVertex in range(self.nLocalFluidInterfaceNodes):
|
|
+ for iVertex in range(self.nLocalFluidInterfaceNodes):
|
|
if FluidSolver.IsAHaloNode(self.fluidInterfaceIdentifier, iVertex) == True:
|
|
GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
|
|
- self.FluidHaloNodeList[GlobalIndex] = iVertex
|
|
+ self.FluidHaloNodeList[GlobalIndex] = iVertex
|
|
self.nLocalFluidInterfaceHaloNode += 1
|
|
# Calculate the number of physical (= not halo) nodes on each partition
|
|
self.nLocalFluidInterfacePhysicalNodes = self.nLocalFluidInterfaceNodes - self.nLocalFluidInterfaceHaloNode
|
|
@@ -308,10 +308,10 @@
|
|
|
|
# Same thing for the solid part
|
|
self.nLocalSolidInterfaceHaloNode = 0
|
|
- #for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
+ #for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
#if SoliddSolver.IsAHaloNode(self.fluidInterfaceIdentifier, iVertex) == True:
|
|
#GlobalIndex = SolidSolver.GetVertexGlobalIndex(self.solidInterfaceIdentifier, iVertex)
|
|
- #self.SolidHaloNodeList[GlobalIndex] = iVertex
|
|
+ #self.SolidHaloNodeList[GlobalIndex] = iVertex
|
|
#self.nLocalSolidInterfaceHaloNode += 1
|
|
self.nLocalSolidInterfacePhysicalNodes = self.nLocalSolidInterfaceNodes - self.nLocalSolidInterfaceHaloNode
|
|
if self.have_MPI == True:
|
|
@@ -323,11 +323,11 @@
|
|
# --- Calculate the total number of nodes (with and without halo) at the fluid interface (sum over all the partitions) and broadcast the number accross all processors ---
|
|
sendBuffHalo = np.array(int(self.nLocalFluidInterfaceNodes))
|
|
sendBuffPhysical = np.array(int(self.nLocalFluidInterfacePhysicalNodes))
|
|
- rcvBuffHalo = np.zeros(1, dtype=int)
|
|
+ rcvBuffHalo = np.zeros(1, dtype=int)
|
|
rcvBuffPhysical = np.zeros(1, dtype=int)
|
|
- if self.have_MPI == True:
|
|
+ if self.have_MPI == True:
|
|
self.comm.barrier()
|
|
- self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
|
|
+ self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
|
|
self.comm.Allreduce(sendBuffPhysical,rcvBuffPhysical,op=self.MPI.SUM)
|
|
self.nFluidInterfaceNodes = rcvBuffHalo[0]
|
|
self.nFluidInterfacePhysicalNodes = rcvBuffPhysical[0]
|
|
@@ -339,11 +339,11 @@
|
|
# Same thing for the solid part
|
|
sendBuffHalo = np.array(int(self.nLocalSolidInterfaceNodes))
|
|
sendBuffPhysical = np.array(int(self.nLocalSolidInterfacePhysicalNodes))
|
|
- rcvBuffHalo = np.zeros(1, dtype=int)
|
|
+ rcvBuffHalo = np.zeros(1, dtype=int)
|
|
rcvBuffPhysical = np.zeros(1, dtype=int)
|
|
if self.have_MPI == True:
|
|
- self.comm.barrier()
|
|
- self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
|
|
+ self.comm.barrier()
|
|
+ self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
|
|
self.comm.Allreduce(sendBuffPhysical,rcvBuffPhysical,op=self.MPI.SUM)
|
|
self.nSolidInterfaceNodes = rcvBuffHalo[0]
|
|
self.nSolidInterfacePhysicalNodes = rcvBuffPhysical[0]
|
|
@@ -375,7 +375,7 @@
|
|
if myid in self.fluidInterfaceProcessors:
|
|
globalIndexStart = 0
|
|
for iProc in range(myid):
|
|
- globalIndexStart += self.fluidPhysicalInterfaceNodesDistribution[iProc]
|
|
+ globalIndexStart += self.fluidPhysicalInterfaceNodesDistribution[iProc]
|
|
globalIndexStop = globalIndexStart + self.nLocalFluidInterfacePhysicalNodes-1
|
|
else:
|
|
globalIndexStart = 0
|
|
@@ -387,8 +387,8 @@
|
|
temp[0] = [0,self.nLocalFluidInterfacePhysicalNodes-1]
|
|
self.fluidGlobalIndexRange = list()
|
|
self.fluidGlobalIndexRange.append(temp)
|
|
-
|
|
- # Same thing for the solid part
|
|
+
|
|
+ # Same thing for the solid part
|
|
if self.have_MPI == True:
|
|
if myid in self.solidInterfaceProcessors:
|
|
globalIndexStart = 0
|
|
@@ -404,14 +404,14 @@
|
|
temp = {}
|
|
temp[0] = [0,self.nSolidInterfacePhysicalNodes-1]
|
|
self.solidGlobalIndexRange = list()
|
|
- self.solidGlobalIndexRange.append(temp)
|
|
+ self.solidGlobalIndexRange.append(temp)
|
|
|
|
- self.MPIPrint('Total number of fluid interface nodes (halo nodes included) : {}'.format(self.nFluidInterfaceNodes))
|
|
- self.MPIPrint('Total number of solid interface nodes (halo nodes included) : {}'.format(self.nSolidInterfaceNodes))
|
|
+ self.MPIPrint('Total number of fluid interface nodes (halo nodes included) : {}'.format(self.nFluidInterfaceNodes))
|
|
+ self.MPIPrint('Total number of solid interface nodes (halo nodes included) : {}'.format(self.nSolidInterfaceNodes))
|
|
self.MPIPrint('Total number of fluid interface nodes : {}'.format(self.nFluidInterfacePhysicalNodes))
|
|
self.MPIPrint('Total number of solid interface nodes : {}'.format(self.nSolidInterfacePhysicalNodes))
|
|
|
|
- self.MPIBarrier()
|
|
+ self.MPIBarrier()
|
|
|
|
# --- Create all the PETSc vectors required for parallel communication and parallel mesh mapping/interpolation (working for serial too) ---
|
|
if self.have_MPI == True:
|
|
@@ -432,8 +432,8 @@
|
|
self.solidInterface_array_DispY.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
self.solidInterface_array_DispZ.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
self.solidInterface_array_DispX.set(0.0)
|
|
- self.solidInterface_array_DispY.set(0.0)
|
|
- self.solidInterface_array_DispZ.set(0.0)
|
|
+ self.solidInterface_array_DispY.set(0.0)
|
|
+ self.solidInterface_array_DispZ.set(0.0)
|
|
|
|
if self.have_MPI == True:
|
|
self.fluidInterface_array_DispX = PETSc.Vec().create(self.comm)
|
|
@@ -536,30 +536,30 @@
|
|
self.solidInterfaceResidualnM1_array_Z.set(0.0)
|
|
|
|
def interfaceMapping(self,FluidSolver, SolidSolver, FSI_config):
|
|
- """
|
|
- Creates the one-to-one mapping between interfaces in case of matching meshes.
|
|
- Creates the interpolation rules between interfaces in case of non-matching meshes.
|
|
- """
|
|
- if self.have_MPI == True:
|
|
+ """
|
|
+ Creates the one-to-one mapping between interfaces in case of matching meshes.
|
|
+ Creates the interpolation rules between interfaces in case of non-matching meshes.
|
|
+ """
|
|
+ if self.have_MPI == True:
|
|
myid = self.comm.Get_rank()
|
|
- MPIsize = self.comm.Get_size()
|
|
+ MPIsize = self.comm.Get_size()
|
|
else:
|
|
myid = 0
|
|
MPIsize = 1
|
|
|
|
- # --- Get the fluid interface from fluid solver on each partition ---
|
|
- GlobalIndex = int()
|
|
+ # --- Get the fluid interface from fluid solver on each partition ---
|
|
+ GlobalIndex = int()
|
|
localIndex = 0
|
|
fluidIndexing_temp = {}
|
|
self.localFluidInterface_array_X_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
|
|
self.localFluidInterface_array_Y_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
|
|
self.localFluidInterface_array_Z_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
|
|
for iVertex in range(self.nLocalFluidInterfaceNodes):
|
|
- GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
|
|
- posx = FluidSolver.GetVertexCoordX(self.fluidInterfaceIdentifier, iVertex)
|
|
- posy = FluidSolver.GetVertexCoordY(self.fluidInterfaceIdentifier, iVertex)
|
|
- posz = FluidSolver.GetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex)
|
|
- if GlobalIndex in self.FluidHaloNodeList[myid].keys():
|
|
+ GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
|
|
+ posx = FluidSolver.GetVertexCoordX(self.fluidInterfaceIdentifier, iVertex)
|
|
+ posy = FluidSolver.GetVertexCoordY(self.fluidInterfaceIdentifier, iVertex)
|
|
+ posz = FluidSolver.GetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex)
|
|
+ if GlobalIndex in self.FluidHaloNodeList[myid].keys():
|
|
self.haloNodesPositionsInit[GlobalIndex] = (posx, posy, posz)
|
|
else:
|
|
fluidIndexing_temp[GlobalIndex] = self.__getGlobalIndex('fluid', myid, localIndex)
|
|
@@ -576,17 +576,17 @@
|
|
self.fluidIndexing = fluidIndexing_temp.copy()
|
|
del fluidIndexing_temp
|
|
|
|
- # --- Get the solid interface from solid solver on each partition ---
|
|
+ # --- Get the solid interface from solid solver on each partition ---
|
|
localIndex = 0
|
|
solidIndexing_temp = {}
|
|
- self.localSolidInterface_array_X = np.zeros(self.nLocalSolidInterfaceNodes)
|
|
+ self.localSolidInterface_array_X = np.zeros(self.nLocalSolidInterfaceNodes)
|
|
self.localSolidInterface_array_Y = np.zeros(self.nLocalSolidInterfaceNodes)
|
|
self.localSolidInterface_array_Z = np.zeros(self.nLocalSolidInterfaceNodes)
|
|
for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
|
|
- posx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
|
|
- posy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
|
|
- posz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
|
|
+ posx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
|
|
+ posy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
|
|
+ posz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
|
|
if GlobalIndex in self.SolidHaloNodeList[myid].keys():
|
|
pass
|
|
else:
|
|
@@ -605,14 +605,14 @@
|
|
del solidIndexing_temp
|
|
|
|
|
|
- # --- Create the PETSc parallel interpolation matrix ---
|
|
+ # --- Create the PETSc parallel interpolation matrix ---
|
|
if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
|
|
if self.have_MPI == True:
|
|
self.MappingMatrixA = PETSc.Mat().create(self.comm)
|
|
self.MappingMatrixB = PETSc.Mat().create(self.comm)
|
|
self.MappingMatrixA_T = PETSc.Mat().create(self.comm)
|
|
self.MappingMatrixB_T = PETSc.Mat().create(self.comm)
|
|
- if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
|
|
+ if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
|
|
self.MappingMatrixA.setType('mpiaij')
|
|
self.MappingMatrixB.setType('mpiaij')
|
|
self.MappingMatrixA_T.setType('mpiaij')
|
|
@@ -627,7 +627,7 @@
|
|
self.MappingMatrixB = PETSc.Mat().create()
|
|
self.MappingMatrixA_T = PETSc.Mat().create()
|
|
self.MappingMatrixB_T = PETSc.Mat().create()
|
|
- if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
|
|
+ if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
|
|
self.MappingMatrixA.setType('aij')
|
|
self.MappingMatrixB.setType('aij')
|
|
self.MappingMatrixA_T.setType('aij')
|
|
@@ -637,16 +637,16 @@
|
|
self.MappingMatrixB.setType('aij')
|
|
self.MappingMatrixA_T.setType('aij')
|
|
self.MappingMatrixB_T.setType('aij')
|
|
- self.MappingMatrixA.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
|
|
+ self.MappingMatrixA.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
|
|
self.MappingMatrixA.setUp()
|
|
self.MappingMatrixA.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
|
|
- self.MappingMatrixB.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes+self.d_RBF))
|
|
+ self.MappingMatrixB.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes+self.d_RBF))
|
|
self.MappingMatrixB.setUp()
|
|
self.MappingMatrixB.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
|
|
- self.MappingMatrixA_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
|
|
+ self.MappingMatrixA_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
|
|
self.MappingMatrixA_T.setUp()
|
|
self.MappingMatrixA_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
|
|
- self.MappingMatrixB_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nFluidInterfacePhysicalNodes))
|
|
+ self.MappingMatrixB_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nFluidInterfacePhysicalNodes))
|
|
self.MappingMatrixB_T.setUp()
|
|
self.MappingMatrixB_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
|
|
else:
|
|
@@ -660,21 +660,21 @@
|
|
self.MappingMatrix_T = PETSc.Mat().create()
|
|
self.MappingMatrix.setType('aij')
|
|
self.MappingMatrix_T.setType('aij')
|
|
- self.MappingMatrix.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes))
|
|
+ self.MappingMatrix.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes))
|
|
self.MappingMatrix.setUp()
|
|
self.MappingMatrix.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
|
|
- self.MappingMatrix_T.setSizes((self.nSolidInterfacePhysicalNodes, self.nFluidInterfacePhysicalNodes))
|
|
+ self.MappingMatrix_T.setSizes((self.nSolidInterfacePhysicalNodes, self.nFluidInterfacePhysicalNodes))
|
|
self.MappingMatrix_T.setUp()
|
|
self.MappingMatrix_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
|
|
-
|
|
-
|
|
+
|
|
+
|
|
# --- Fill the interpolation matrix in parallel (working in serial too) ---
|
|
if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
|
|
self.MPIPrint('Building interpolation matrices...')
|
|
if self.have_MPI == True:
|
|
for iProc in self.solidInterfaceProcessors:
|
|
if myid == iProc:
|
|
- for jProc in self.solidInterfaceProcessors:
|
|
+ for jProc in self.solidInterfaceProcessors:
|
|
self.comm.Send(self.localSolidInterface_array_X, dest=jProc, tag=1)
|
|
self.comm.Send(self.localSolidInterface_array_Y, dest=jProc, tag=2)
|
|
self.comm.Send(self.localSolidInterface_array_Z, dest=jProc, tag=3)
|
|
@@ -726,7 +726,7 @@
|
|
self.TPSMeshMapping_B(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
|
|
else:
|
|
self.NearestNeighboorMeshMapping(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
|
|
- else:
|
|
+ else:
|
|
self.matchingMeshMapping(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
|
|
else:
|
|
if FSI_config['MATCHING_MESH'] == 'NO':
|
|
@@ -735,10 +735,10 @@
|
|
elif FSI_config['MESH_INTERP_METHOD'] == 'TPS' :
|
|
self.TPSMeshMapping_B(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
|
|
else:
|
|
- self.NearestNeighboorMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
|
|
- else:
|
|
+ self.NearestNeighboorMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
|
|
+ else:
|
|
self.matchingMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
|
|
-
|
|
+
|
|
if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
|
|
self.MappingMatrixB.assemblyBegin()
|
|
self.MappingMatrixB.assemblyEnd()
|
|
@@ -751,9 +751,9 @@
|
|
self.MappingMatrix_T.assemblyBegin()
|
|
self.MappingMatrix_T.assemblyEnd()
|
|
self.MPIPrint("Interpolation matrix is built.")
|
|
-
|
|
+
|
|
self.MPIBarrier()
|
|
-
|
|
+
|
|
del self.localSolidInterface_array_X
|
|
del self.localSolidInterface_array_Y
|
|
del self.localSolidInterface_array_Z
|
|
@@ -768,20 +768,20 @@
|
|
myid = 0
|
|
|
|
# --- Instantiate the spatial indexing ---
|
|
- prop_index = index.Property()
|
|
- prop_index.dimension = self.nDim
|
|
- SolidSpatialTree = index.Index(properties=prop_index)
|
|
-
|
|
+ prop_index = index.Property()
|
|
+ prop_index.dimension = self.nDim
|
|
+ SolidSpatialTree = index.Index(properties=prop_index)
|
|
+
|
|
nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
|
|
|
|
for jVertex in range(nSolidNodes):
|
|
posX = solidInterfaceBuffRcv_X[jVertex]
|
|
posY = solidInterfaceBuffRcv_Y[jVertex]
|
|
posZ = solidInterfaceBuffRcv_Z[jVertex]
|
|
- if self.nDim == 2 :
|
|
- SolidSpatialTree.add(jVertex, (posX, posY))
|
|
- else :
|
|
- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
|
|
+ if self.nDim == 2 :
|
|
+ SolidSpatialTree.add(jVertex, (posX, posY))
|
|
+ else :
|
|
+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
|
|
|
|
if self.nFluidInterfacePhysicalNodes != self.nSolidInterfacePhysicalNodes:
|
|
raise Exception("Fluid and solid interface must have the same number of nodes for matching meshes ! ")
|
|
@@ -822,20 +822,20 @@
|
|
myid = 0
|
|
|
|
# --- Instantiate the spatial indexing ---
|
|
- prop_index = index.Property()
|
|
- prop_index.dimension = self.nDim
|
|
- SolidSpatialTree = index.Index(properties=prop_index)
|
|
-
|
|
+ prop_index = index.Property()
|
|
+ prop_index.dimension = self.nDim
|
|
+ SolidSpatialTree = index.Index(properties=prop_index)
|
|
+
|
|
nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
|
|
|
|
for jVertex in range(nSolidNodes):
|
|
posX = solidInterfaceBuffRcv_X[jVertex]
|
|
posY = solidInterfaceBuffRcv_Y[jVertex]
|
|
posZ = solidInterfaceBuffRcv_Z[jVertex]
|
|
- if self.nDim == 2 :
|
|
- SolidSpatialTree.add(jVertex, (posX, posY))
|
|
- else :
|
|
- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
|
|
+ if self.nDim == 2 :
|
|
+ SolidSpatialTree.add(jVertex, (posX, posY))
|
|
+ else :
|
|
+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
|
|
|
|
# --- For each fluid interface node, find the nearest solid interface node and fill the boolean mapping matrix ---
|
|
for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
|
|
@@ -863,20 +863,20 @@
|
|
myid = 0
|
|
|
|
# --- Instantiate the spatial indexing ---
|
|
- prop_index = index.Property()
|
|
- prop_index.dimension = self.nDim
|
|
- SolidSpatialTree = index.Index(properties=prop_index)
|
|
-
|
|
+ prop_index = index.Property()
|
|
+ prop_index.dimension = self.nDim
|
|
+ SolidSpatialTree = index.Index(properties=prop_index)
|
|
+
|
|
nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
|
|
|
|
for jVertex in range(nSolidNodes):
|
|
posX = solidInterfaceBuffRcv_X[jVertex]
|
|
posY = solidInterfaceBuffRcv_Y[jVertex]
|
|
posZ = solidInterfaceBuffRcv_Z[jVertex]
|
|
- if self.nDim == 2 :
|
|
- SolidSpatialTree.add(jVertex, (posX, posY))
|
|
- else :
|
|
- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
|
|
+ if self.nDim == 2 :
|
|
+ SolidSpatialTree.add(jVertex, (posX, posY))
|
|
+ else :
|
|
+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
|
|
|
|
for iVertexSolid in range(self.nLocalSolidInterfaceNodes):
|
|
posX = self.localSolidInterface_array_X[iVertexSolid]
|
|
@@ -915,20 +915,20 @@
|
|
myid = 0
|
|
|
|
# --- Instantiate the spatial indexing ---
|
|
- prop_index = index.Property()
|
|
- prop_index.dimension = self.nDim
|
|
- SolidSpatialTree = index.Index(properties=prop_index)
|
|
-
|
|
+ prop_index = index.Property()
|
|
+ prop_index.dimension = self.nDim
|
|
+ SolidSpatialTree = index.Index(properties=prop_index)
|
|
+
|
|
nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
|
|
|
|
for jVertex in range(nSolidNodes):
|
|
posX = solidInterfaceBuffRcv_X[jVertex]
|
|
posY = solidInterfaceBuffRcv_Y[jVertex]
|
|
posZ = solidInterfaceBuffRcv_Z[jVertex]
|
|
- if self.nDim == 2 :
|
|
- SolidSpatialTree.add(jVertex, (posX, posY))
|
|
- else :
|
|
- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
|
|
+ if self.nDim == 2 :
|
|
+ SolidSpatialTree.add(jVertex, (posX, posY))
|
|
+ else :
|
|
+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
|
|
|
|
for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
|
|
posX = self.localFluidInterface_array_X_init[iVertexFluid]
|
|
@@ -965,7 +965,7 @@
|
|
myid = self.comm.Get_rank()
|
|
else:
|
|
myid = 0
|
|
-
|
|
+
|
|
nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
|
|
|
|
for iVertexSolid in range(self.nLocalSolidInterfaceNodes):
|
|
@@ -999,7 +999,7 @@
|
|
myid = self.comm.Get_rank()
|
|
else:
|
|
myid = 0
|
|
-
|
|
+
|
|
nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
|
|
|
|
for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
|
|
@@ -1031,7 +1031,7 @@
|
|
"""
|
|
phi = 0.0
|
|
eps = distance/rad
|
|
-
|
|
+
|
|
if eps < 1:
|
|
phi = ((1.0-eps)**4)*(4.0*eps+1.0)
|
|
else:
|
|
@@ -1044,20 +1044,20 @@
|
|
Description
|
|
"""
|
|
phi = 0.0
|
|
-
|
|
+
|
|
if distance > 0.0:
|
|
phi = (distance**2)*np.log10(distance)
|
|
else:
|
|
phi = 0.0
|
|
|
|
- return phi
|
|
+ return phi
|
|
|
|
|
|
def interpolateSolidPositionOnFluidMesh(self, FSI_config):
|
|
- """
|
|
- Applies the one-to-one mapping or the interpolaiton rules from solid to fluid mesh.
|
|
- """
|
|
- if self.have_MPI == True:
|
|
+ """
|
|
+ Applies the one-to-one mapping or the interpolaiton rules from solid to fluid mesh.
|
|
+ """
|
|
+ if self.have_MPI == True:
|
|
myid = self.comm.Get_rank()
|
|
MPIsize = self.comm.Get_size()
|
|
else:
|
|
@@ -1110,12 +1110,12 @@
|
|
del gamma_array_DispY
|
|
del gamma_array_DispZ
|
|
del KSP_solver
|
|
- else:
|
|
+ else:
|
|
self.MappingMatrix.mult(self.solidInterface_array_DispX, self.fluidInterface_array_DispX)
|
|
self.MappingMatrix.mult(self.solidInterface_array_DispY, self.fluidInterface_array_DispY)
|
|
self.MappingMatrix.mult(self.solidInterface_array_DispZ, self.fluidInterface_array_DispZ)
|
|
|
|
- # --- Checking conservation ---
|
|
+ # --- Checking conservation ---
|
|
WSX = self.solidLoads_array_X.dot(self.solidInterface_array_DispX)
|
|
WSY = self.solidLoads_array_Y.dot(self.solidInterface_array_DispY)
|
|
WSZ = self.solidLoads_array_Z.dot(self.solidInterface_array_DispZ)
|
|
@@ -1124,11 +1124,11 @@
|
|
WFY = self.fluidLoads_array_Y.dot(self.fluidInterface_array_DispY)
|
|
WFZ = self.fluidLoads_array_Z.dot(self.fluidInterface_array_DispZ)
|
|
|
|
- self.MPIPrint("Checking f/s interface conservation...")
|
|
- self.MPIPrint('Solid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WSX, WSY, WSZ))
|
|
- self.MPIPrint('Fluid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WFX, WFY, WFZ))
|
|
+ self.MPIPrint("Checking f/s interface conservation...")
|
|
+ self.MPIPrint('Solid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WSX, WSY, WSZ))
|
|
+ self.MPIPrint('Fluid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WFX, WFY, WFZ))
|
|
+
|
|
|
|
-
|
|
# --- Redistribute the interpolated fluid interface according to the partitions that own the fluid interface ---
|
|
# Gather the fluid interface on the master process
|
|
if self.have_MPI == True:
|
|
@@ -1156,7 +1156,7 @@
|
|
displ = tuple(displ)
|
|
|
|
del sendBuffNumber, rcvBuffNumber
|
|
-
|
|
+
|
|
#print("DEBUG MESSAGE From proc {}, counts = {}".format(myid, counts))
|
|
#print("DEBUG MESSAGE From proc {}, displ = {}".format(myid, displ))
|
|
|
|
@@ -1213,18 +1213,18 @@
|
|
del sendBuff
|
|
|
|
def interpolateFluidLoadsOnSolidMesh(self, FSI_config):
|
|
- """
|
|
- Applies the one-to-one mapping or the interpolaiton rules from fluid to solid mesh.
|
|
- """
|
|
- if self.have_MPI == True:
|
|
+ """
|
|
+ Applies the one-to-one mapping or the interpolaiton rules from fluid to solid mesh.
|
|
+ """
|
|
+ if self.have_MPI == True:
|
|
myid = self.comm.Get_rank()
|
|
MPIsize = self.comm.Get_size()
|
|
else:
|
|
myid = 0
|
|
MPIsize = 1
|
|
-
|
|
+
|
|
# --- Interpolate (or map) in parallel the fluid interface loads on the solid interface ---
|
|
- #self.MappingMatrix.transpose()
|
|
+ #self.MappingMatrix.transpose()
|
|
if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
|
|
if self.have_MPI == True:
|
|
gamma_array_LoadX = PETSc.Vec().create(self.comm)
|
|
@@ -1280,10 +1280,10 @@
|
|
self.solidLoads_array_X_recon = None
|
|
self.solidLoads_array_Y_recon = None
|
|
self.solidLoads_array_Z_recon = None
|
|
- if myid == self.rootProcess:
|
|
- self.solidLoads_array_X_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
- self.solidLoads_array_Y_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
- self.solidLoads_array_Z_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
+ if myid == self.rootProcess:
|
|
+ self.solidLoads_array_X_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
+ self.solidLoads_array_Y_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
+ self.solidLoads_array_Z_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
myNumberOfNodes = self.solidLoads_array_X.getArray().shape[0]
|
|
sendBuffNumber = np.array([myNumberOfNodes], dtype=int)
|
|
rcvBuffNumber = np.zeros(MPIsize, dtype=int)
|
|
@@ -1293,9 +1293,9 @@
|
|
displ = np.zeros(MPIsize, dtype=int)
|
|
for ii in range(rcvBuffNumber.shape[0]):
|
|
displ[ii] = rcvBuffNumber[0:ii].sum()
|
|
- displ = tuple(displ)
|
|
+ displ = tuple(displ)
|
|
|
|
- del sendBuffNumber, rcvBuffNumber
|
|
+ del sendBuffNumber, rcvBuffNumber
|
|
|
|
self.comm.Gatherv(self.solidLoads_array_X.getArray(), [self.solidLoads_array_X_recon, counts, displ, self.MPI.DOUBLE], root=self.rootProcess)
|
|
self.comm.Gatherv(self.solidLoads_array_Y.getArray(), [self.solidLoads_array_Y_recon, counts, displ, self.MPI.DOUBLE], root=self.rootProcess)
|
|
@@ -1336,25 +1336,25 @@
|
|
|
|
|
|
'''def getSolidInterfacePosition(self, SolidSolver):
|
|
- """
|
|
- Gets the current solid interface position from the solid solver.
|
|
- """
|
|
+ """
|
|
+ Gets the current solid interface position from the solid solver.
|
|
+ """
|
|
if self.have_MPI == True:
|
|
- myid = self.comm.Get_rank()
|
|
+ myid = self.comm.Get_rank()
|
|
else:
|
|
myid = 0
|
|
-
|
|
+
|
|
# --- Get the solid interface position from the solid solver and directly fill the corresponding PETSc vector ---
|
|
GlobalIndex = int()
|
|
localIndex = 0
|
|
- for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
+ for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
|
|
if GlobalIndex in self.SolidHaloNodeList[myid].keys():
|
|
pass
|
|
else:
|
|
- newPosx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
|
|
- newPosy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
|
|
- newPosz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
|
|
+ newPosx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
|
|
+ newPosy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
|
|
+ newPosz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
|
|
iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
|
|
self.solidInterface_array_X.setValues([iGlobalVertex],newPosx)
|
|
self.solidInterface_array_Y.setValues([iGlobalVertex],newPosy)
|
|
@@ -1375,25 +1375,25 @@
|
|
#print("DEBUG MESSAGE From PROC {} : array_X = {}".format(myid, self.solidInterface_array_X.getArray()))'''
|
|
|
|
def getSolidInterfaceDisplacement(self, SolidSolver):
|
|
- """
|
|
- Gets the current solid interface position from the solid solver.
|
|
- """
|
|
+ """
|
|
+ Gets the current solid interface position from the solid solver.
|
|
+ """
|
|
if self.have_MPI == True:
|
|
- myid = self.comm.Get_rank()
|
|
+ myid = self.comm.Get_rank()
|
|
else:
|
|
myid = 0
|
|
-
|
|
+
|
|
# --- Get the solid interface position from the solid solver and directly fill the corresponding PETSc vector ---
|
|
GlobalIndex = int()
|
|
localIndex = 0
|
|
- for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
+ for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
|
|
if GlobalIndex in self.SolidHaloNodeList[myid].keys():
|
|
pass
|
|
else:
|
|
- newDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
|
|
- newDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
|
|
- newDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
|
|
+ newDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
|
|
+ newDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
|
|
+ newDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
|
|
iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
|
|
self.solidInterface_array_DispX.setValues([iGlobalVertex],newDispx)
|
|
self.solidInterface_array_DispY.setValues([iGlobalVertex],newDispy)
|
|
@@ -1408,9 +1408,9 @@
|
|
self.solidInterface_array_DispZ.assemblyEnd()
|
|
|
|
def getFluidInterfaceNodalForce(self, FSI_config, FluidSolver):
|
|
- """
|
|
- Gets the fluid interface loads from the fluid solver.
|
|
- """
|
|
+ """
|
|
+ Gets the fluid interface loads from the fluid solver.
|
|
+ """
|
|
if self.have_MPI == True:
|
|
myid = self.comm.Get_rank()
|
|
else:
|
|
@@ -1422,17 +1422,17 @@
|
|
FZ = 0.0
|
|
|
|
# --- Get the fluid interface loads from the fluid solver and directly fill the corresponding PETSc vector ---
|
|
- for iVertex in range(self.nLocalFluidInterfaceNodes):
|
|
- halo = FluidSolver.ComputeVertexForces(self.fluidInterfaceIdentifier, iVertex) # !!we have to ignore halo node coming from mesh partitioning because they introduice non-physical forces
|
|
- if halo==False:
|
|
- if FSI_config['CSD_SOLVER'] == 'GETDP':
|
|
- newFx = FluidSolver.GetVertexForceDensityX(self.fluidInterfaceIdentifier, iVertex)
|
|
- newFy = FluidSolver.GetVertexForceDensityY(self.fluidInterfaceIdentifier, iVertex)
|
|
- newFz = FluidSolver.GetVertexForceDensityZ(self.fluidInterfaceIdentifier, iVertex)
|
|
- else:
|
|
- newFx = FluidSolver.GetVertexForceX(self.fluidInterfaceIdentifier, iVertex)
|
|
- newFy = FluidSolver.GetVertexForceY(self.fluidInterfaceIdentifier, iVertex)
|
|
- newFz = FluidSolver.GetVertexForceZ(self.fluidInterfaceIdentifier, iVertex)
|
|
+ for iVertex in range(self.nLocalFluidInterfaceNodes):
|
|
+ halo = FluidSolver.ComputeVertexForces(self.fluidInterfaceIdentifier, iVertex) # !!we have to ignore halo node coming from mesh partitioning because they introduice non-physical forces
|
|
+ if halo==False:
|
|
+ if FSI_config['CSD_SOLVER'] == 'GETDP':
|
|
+ newFx = FluidSolver.GetVertexForceDensityX(self.fluidInterfaceIdentifier, iVertex)
|
|
+ newFy = FluidSolver.GetVertexForceDensityY(self.fluidInterfaceIdentifier, iVertex)
|
|
+ newFz = FluidSolver.GetVertexForceDensityZ(self.fluidInterfaceIdentifier, iVertex)
|
|
+ else:
|
|
+ newFx = FluidSolver.GetVertexForceX(self.fluidInterfaceIdentifier, iVertex)
|
|
+ newFy = FluidSolver.GetVertexForceY(self.fluidInterfaceIdentifier, iVertex)
|
|
+ newFz = FluidSolver.GetVertexForceZ(self.fluidInterfaceIdentifier, iVertex)
|
|
iGlobalVertex = self.__getGlobalIndex('fluid', myid, localIndex)
|
|
self.fluidLoads_array_X.setValues([iGlobalVertex], newFx)
|
|
self.fluidLoads_array_Y.setValues([iGlobalVertex], newFy)
|
|
@@ -1457,22 +1457,22 @@
|
|
FX_b = self.fluidLoads_array_X.sum()
|
|
FY_b = self.fluidLoads_array_Y.sum()
|
|
FZ_b = self.fluidLoads_array_Z.sum()
|
|
-
|
|
+
|
|
|
|
def setFluidInterfaceVarCoord(self, FluidSolver):
|
|
- """
|
|
- Communicate the change of coordinates of the fluid interface to the fluid solver.
|
|
- Prepare the fluid solver for mesh deformation.
|
|
- """
|
|
+ """
|
|
+ Communicate the change of coordinates of the fluid interface to the fluid solver.
|
|
+ Prepare the fluid solver for mesh deformation.
|
|
+ """
|
|
if self.have_MPI == True:
|
|
- myid = self.comm.Get_rank()
|
|
+ myid = self.comm.Get_rank()
|
|
else:
|
|
myid = 0
|
|
-
|
|
+
|
|
# --- Send the new fluid interface position to the fluid solver (on each partition, halo nodes included) ---
|
|
localIndex = 0
|
|
- for iVertex in range(self.nLocalFluidInterfaceNodes):
|
|
- GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
|
|
+ for iVertex in range(self.nLocalFluidInterfaceNodes):
|
|
+ GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
|
|
if GlobalIndex in self.FluidHaloNodeList[myid].keys():
|
|
posX0, posY0, posZ0 = self.haloNodesPositionsInit[GlobalIndex]
|
|
DispX, DispY, DispZ = self.haloNodesDisplacements[GlobalIndex]
|
|
@@ -1491,32 +1491,32 @@
|
|
FluidSolver.SetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex, posZ)
|
|
localIndex += 1
|
|
# Prepares the mesh deformation in the fluid solver
|
|
- nodalVarCoordNorm = FluidSolver.SetVertexVarCoord(self.fluidInterfaceIdentifier, iVertex)
|
|
+ nodalVarCoordNorm = FluidSolver.SetVertexVarCoord(self.fluidInterfaceIdentifier, iVertex)
|
|
+
|
|
|
|
-
|
|
def setSolidInterfaceLoads(self, SolidSolver, FSI_config, time):
|
|
- """
|
|
- Communicates the new solid interface loads to the solid solver.
|
|
- In case of rigid body motion, calculates the new resultant forces (lift, drag, ...).
|
|
- """
|
|
+ """
|
|
+ Communicates the new solid interface loads to the solid solver.
|
|
+ In case of rigid body motion, calculates the new resultant forces (lift, drag, ...).
|
|
+ """
|
|
if self.have_MPI == True:
|
|
- myid = self.comm.Get_rank()
|
|
+ myid = self.comm.Get_rank()
|
|
else:
|
|
myid = 0
|
|
|
|
- FY = 0.0 # solid-side resultant forces
|
|
+ FY = 0.0 # solid-side resultant forces
|
|
FX = 0.0
|
|
FZ = 0.0
|
|
- FFX = 0.0 # fluid-side resultant forces
|
|
- FFY = 0.0
|
|
- FFZ = 0.0
|
|
+ FFX = 0.0 # fluid-side resultant forces
|
|
+ FFY = 0.0
|
|
+ FFZ = 0.0
|
|
|
|
# --- Check for total force conservation after interpolation
|
|
FFX = self.fluidLoads_array_X.sum()
|
|
FFY = self.fluidLoads_array_Y.sum()
|
|
FFZ = self.fluidLoads_array_Z.sum()
|
|
|
|
-
|
|
+
|
|
for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
FX += self.localSolidLoads_array_X[iVertex]
|
|
FY += self.localSolidLoads_array_Y[iVertex]
|
|
@@ -1527,9 +1527,9 @@
|
|
FY = self.comm.allreduce(FY)
|
|
FZ = self.comm.allreduce(FZ)
|
|
|
|
- self.MPIPrint("Checking f/s interface total force...")
|
|
- self.MPIPrint('Solid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FX, FY, FZ))
|
|
- self.MPIPrint('Fluid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FFX, FFY, FFZ))
|
|
+ self.MPIPrint("Checking f/s interface total force...")
|
|
+ self.MPIPrint('Solid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FX, FY, FZ))
|
|
+ self.MPIPrint('Fluid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FFX, FFY, FFZ))
|
|
|
|
# --- Send the new solid interface loads to the solid solver (on each partition, halo nodes included) ---
|
|
GlobalIndex = int()
|
|
@@ -1541,25 +1541,25 @@
|
|
pass
|
|
else:
|
|
Fx = self.localSolidLoads_array_X[localIndex]
|
|
- Fy = self.localSolidLoads_array_Y[localIndex]
|
|
- Fz = self.localSolidLoads_array_Z[localIndex]
|
|
+ Fy = self.localSolidLoads_array_Y[localIndex]
|
|
+ Fz = self.localSolidLoads_array_Z[localIndex]
|
|
SolidSolver.applyload(iVertex, Fx, Fy, Fz, time)
|
|
localIndex += 1
|
|
- if FSI_config['CSD_SOLVER'] == 'NATIVE':
|
|
+ if FSI_config['CSD_SOLVER'] == 'NATIVE':
|
|
SolidSolver.setGeneralisedForce()
|
|
- SolidSolver.setGeneralisedMoment()
|
|
+ SolidSolver.setGeneralisedMoment()
|
|
|
|
def computeSolidInterfaceResidual(self, SolidSolver):
|
|
- """
|
|
- Computes the solid interface FSI displacement residual.
|
|
- """
|
|
+ """
|
|
+ Computes the solid interface FSI displacement residual.
|
|
+ """
|
|
|
|
if self.have_MPI == True:
|
|
- myid = self.comm.Get_rank()
|
|
+ myid = self.comm.Get_rank()
|
|
else:
|
|
myid = 0
|
|
|
|
- normInterfaceResidualSquare = 0.0
|
|
+ normInterfaceResidualSquare = 0.0
|
|
|
|
# --- Create and fill the PETSc vector for the predicted solid interface position (predicted by the solid computation) ---
|
|
if self.have_MPI == True:
|
|
@@ -1575,27 +1575,27 @@
|
|
predDisp_array_Y = PETSc.Vec().create()
|
|
predDisp_array_Y.setType('seq')
|
|
predDisp_array_Z = PETSc.Vec().create()
|
|
- predDisp_array_Z.setType('seq')
|
|
+ predDisp_array_Z.setType('seq')
|
|
predDisp_array_X.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
predDisp_array_Y.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
predDisp_array_Z.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
|
|
-
|
|
- if myid in self.solidSolverProcessors:
|
|
- for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
- predDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
|
|
- predDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
|
|
- predDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
|
|
+
|
|
+ if myid in self.solidSolverProcessors:
|
|
+ for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
+ predDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
|
|
+ predDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
|
|
+ predDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
|
|
iGlobalVertex = self.__getGlobalIndex('solid', myid, iVertex)
|
|
predDisp_array_X.setValues([iGlobalVertex], predDispx)
|
|
predDisp_array_Y.setValues([iGlobalVertex], predDispy)
|
|
predDisp_array_Z.setValues([iGlobalVertex], predDispz)
|
|
-
|
|
- predDisp_array_X.assemblyBegin()
|
|
- predDisp_array_X.assemblyEnd()
|
|
- predDisp_array_Y.assemblyBegin()
|
|
- predDisp_array_Y.assemblyEnd()
|
|
- predDisp_array_Z.assemblyBegin()
|
|
- predDisp_array_Z.assemblyEnd()
|
|
+
|
|
+ predDisp_array_X.assemblyBegin()
|
|
+ predDisp_array_X.assemblyEnd()
|
|
+ predDisp_array_Y.assemblyBegin()
|
|
+ predDisp_array_Y.assemblyEnd()
|
|
+ predDisp_array_Z.assemblyBegin()
|
|
+ predDisp_array_Z.assemblyEnd()
|
|
|
|
# --- Calculate the residual (vector and norm) ---
|
|
self.solidInterfaceResidual_array_X = predDisp_array_X - self.solidInterface_array_DispX
|
|
@@ -1615,45 +1615,45 @@
|
|
del predDisp_array_Y
|
|
del predDisp_array_Z
|
|
|
|
- return sqrt(normInterfaceResidualSquare)
|
|
+ return sqrt(normInterfaceResidualSquare)
|
|
|
|
def relaxSolidPosition(self,FSI_config):
|
|
- """
|
|
- Apply solid displacement under-relaxation.
|
|
- """
|
|
+ """
|
|
+ Apply solid displacement under-relaxation.
|
|
+ """
|
|
if self.have_MPI == True:
|
|
- myid = self.comm.Get_rank()
|
|
+ myid = self.comm.Get_rank()
|
|
else:
|
|
myid = 0
|
|
|
|
# --- Set the Aitken coefficient for the relaxation ---
|
|
- if FSI_config['AITKEN_RELAX'] == 'STATIC':
|
|
- self.aitkenParam = FSI_config['AITKEN_PARAM']
|
|
- elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
|
|
- self.setAitkenCoefficient(FSI_config)
|
|
- else:
|
|
- self.aitkenParam = 1.0
|
|
+ if FSI_config['AITKEN_RELAX'] == 'STATIC':
|
|
+ self.aitkenParam = FSI_config['AITKEN_PARAM']
|
|
+ elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
|
|
+ self.setAitkenCoefficient(FSI_config)
|
|
+ else:
|
|
+ self.aitkenParam = 1.0
|
|
|
|
- self.MPIPrint('Aitken under-relaxation step with parameter {}'.format(self.aitkenParam))
|
|
+ self.MPIPrint('Aitken under-relaxation step with parameter {}'.format(self.aitkenParam))
|
|
|
|
# --- Relax the solid interface position ---
|
|
self.solidInterface_array_DispX += self.aitkenParam*self.solidInterfaceResidual_array_X
|
|
self.solidInterface_array_DispY += self.aitkenParam*self.solidInterfaceResidual_array_Y
|
|
self.solidInterface_array_DispZ += self.aitkenParam*self.solidInterfaceResidual_array_Z
|
|
-
|
|
+
|
|
|
|
def setAitkenCoefficient(self, FSI_config):
|
|
- """
|
|
- Computes the Aitken coefficients for solid displacement under-relaxation.
|
|
- """
|
|
-
|
|
- deltaResNormSquare = 0.0
|
|
- prodScalRes = 0.0
|
|
-
|
|
+ """
|
|
+ Computes the Aitken coefficients for solid displacement under-relaxation.
|
|
+ """
|
|
+
|
|
+ deltaResNormSquare = 0.0
|
|
+ prodScalRes = 0.0
|
|
+
|
|
# --- Create the PETSc vector for the difference between the residuals (current and previous FSI iter) ---
|
|
- if self.FSIIter == 0:
|
|
- self.aitkenParam = max(FSI_config['AITKEN_PARAM'], self.aitkenParam)
|
|
- else:
|
|
+ if self.FSIIter == 0:
|
|
+ self.aitkenParam = max(FSI_config['AITKEN_PARAM'], self.aitkenParam)
|
|
+ else:
|
|
if self.have_MPI:
|
|
deltaResx_array_X = PETSc.Vec().create(self.comm)
|
|
deltaResx_array_X.setType('mpi')
|
|
@@ -1688,9 +1688,9 @@
|
|
deltaResNormSquare_X = (deltaResx_array_X.norm())**2
|
|
deltaResNormSquare_Y = (deltaResx_array_Y.norm())**2
|
|
deltaResNormSquare_Z = (deltaResx_array_Z.norm())**2
|
|
- deltaResNormSquare = deltaResNormSquare_X + deltaResNormSquare_Y + deltaResNormSquare_Z
|
|
+ deltaResNormSquare = deltaResNormSquare_X + deltaResNormSquare_Y + deltaResNormSquare_Z
|
|
|
|
- self.aitkenParam *= -prodScalRes/deltaResNormSquare
|
|
+ self.aitkenParam *= -prodScalRes/deltaResNormSquare
|
|
|
|
deltaResx_array_X.destroy()
|
|
deltaResx_array_Y.destroy()
|
|
@@ -1708,27 +1708,27 @@
|
|
self.solidInterfaceResidual_array_Z.copy(self.solidInterfaceResidualnM1_array_Z)
|
|
|
|
def displacementPredictor(self, FSI_config , SolidSolver, deltaT):
|
|
- """
|
|
- Calculates a prediciton for the solid interface position for the next time step.
|
|
- """
|
|
+ """
|
|
+ Calculates a prediciton for the solid interface position for the next time step.
|
|
+ """
|
|
|
|
if self.have_MPI == True:
|
|
- myid = self.comm.Get_rank()
|
|
+ myid = self.comm.Get_rank()
|
|
else:
|
|
myid = 0
|
|
|
|
- if FSI_config['DISP_PRED'] == 'FIRST_ORDER':
|
|
- self.MPIPrint("First order predictor")
|
|
- alpha_0 = 1.0
|
|
- alpha_1 = 0.0
|
|
- elif FSI_config['DISP_PRED'] == 'SECOND_ORDER':
|
|
- self.MPIPrint("Second order predictor")
|
|
- alpha_0 = 1.0
|
|
- alpha_1 = 0.5
|
|
- else:
|
|
- self.MPIPrint("No predictor")
|
|
- alpha_0 = 0.0
|
|
- alpha_1 = 0.0
|
|
+ if FSI_config['DISP_PRED'] == 'FIRST_ORDER':
|
|
+ self.MPIPrint("First order predictor")
|
|
+ alpha_0 = 1.0
|
|
+ alpha_1 = 0.0
|
|
+ elif FSI_config['DISP_PRED'] == 'SECOND_ORDER':
|
|
+ self.MPIPrint("Second order predictor")
|
|
+ alpha_0 = 1.0
|
|
+ alpha_1 = 0.5
|
|
+ else:
|
|
+ self.MPIPrint("No predictor")
|
|
+ alpha_0 = 0.0
|
|
+ alpha_1 = 0.0
|
|
|
|
# --- Create the PETSc vectors to store the solid interface velocity ---
|
|
if self.have_MPI == True:
|
|
@@ -1774,18 +1774,18 @@
|
|
# --- Fill the PETSc vectors ---
|
|
GlobalIndex = int()
|
|
localIndex = 0
|
|
- for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
- GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
|
|
+ for iVertex in range(self.nLocalSolidInterfaceNodes):
|
|
+ GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
|
|
if GlobalIndex in self.SolidHaloNodeList[myid].keys():
|
|
pass
|
|
else:
|
|
iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
|
|
- velx = SolidSolver.getInterfaceNodeVelX(self.solidInterfaceIdentifier, iVertex)
|
|
- vely = SolidSolver.getInterfaceNodeVelY(self.solidInterfaceIdentifier, iVertex)
|
|
- velz = SolidSolver.getInterfaceNodeVelZ(self.solidInterfaceIdentifier, iVertex)
|
|
- velxNm1 = SolidSolver.getInterfaceNodeVelXNm1(self.solidInterfaceIdentifier, iVertex)
|
|
- velyNm1 = SolidSolver.getInterfaceNodeVelYNm1(self.solidInterfaceIdentifier, iVertex)
|
|
- velzNm1 = SolidSolver.getInterfaceNodeVelZNm1(self.solidInterfaceIdentifier, iVertex)
|
|
+ velx = SolidSolver.getInterfaceNodeVelX(self.solidInterfaceIdentifier, iVertex)
|
|
+ vely = SolidSolver.getInterfaceNodeVelY(self.solidInterfaceIdentifier, iVertex)
|
|
+ velz = SolidSolver.getInterfaceNodeVelZ(self.solidInterfaceIdentifier, iVertex)
|
|
+ velxNm1 = SolidSolver.getInterfaceNodeVelXNm1(self.solidInterfaceIdentifier, iVertex)
|
|
+ velyNm1 = SolidSolver.getInterfaceNodeVelYNm1(self.solidInterfaceIdentifier, iVertex)
|
|
+ velzNm1 = SolidSolver.getInterfaceNodeVelZNm1(self.solidInterfaceIdentifier, iVertex)
|
|
Vel_array_X.setValues([iGlobalVertex],velx)
|
|
Vel_array_Y.setValues([iGlobalVertex],vely)
|
|
Vel_array_Z.setValues([iGlobalVertex],velz)
|
|
@@ -1822,27 +1822,27 @@
|
|
del VelnM1_array_X, VelnM1_array_Y, VelnM1_array_Z
|
|
|
|
def writeFSIHistory(self, TimeIter, time, varCoordNorm, FSIConv):
|
|
- """
|
|
- Write the FSI history file of the computaion.
|
|
- """
|
|
+ """
|
|
+ Write the FSI history file of the computaion.
|
|
+ """
|
|
|
|
if self.have_MPI == True:
|
|
myid = self.comm.Get_rank()
|
|
else:
|
|
myid = 0
|
|
-
|
|
+
|
|
if myid == self.rootProcess:
|
|
- if self.unsteady:
|
|
- if TimeIter == 0:
|
|
- histFile = open('FSIhistory.dat', "w")
|
|
+ if self.unsteady:
|
|
+ if TimeIter == 0:
|
|
+ histFile = open('FSIhistory.dat', "w")
|
|
histFile.write("TimeIter\tTime\tFSIRes\tFSINbIter\n")
|
|
- else:
|
|
- histFile = open('FSIhistory.dat', "a")
|
|
- if FSIConv:
|
|
- histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter+1) + '\n')
|
|
- else:
|
|
- histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter) + '\n')
|
|
- histFile.close()
|
|
+ else:
|
|
+ histFile = open('FSIhistory.dat', "a")
|
|
+ if FSIConv:
|
|
+ histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter+1) + '\n')
|
|
+ else:
|
|
+ histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter) + '\n')
|
|
+ histFile.close()
|
|
else:
|
|
if self.FSIIter == 0:
|
|
histFile = open('FSIhistory.dat', "w")
|
|
@@ -1851,7 +1851,7 @@
|
|
histFile = open('FSIhistory.dat', "a")
|
|
histFile.write(str(self.FSIIter) + '\t' + str(varCoordNorm) + '\n')
|
|
histFile.close()
|
|
-
|
|
+
|
|
|
|
self.MPIBarrier()
|
|
|
|
@@ -1868,254 +1868,254 @@
|
|
globalIndex = globalStartIndex + iLocalVertex
|
|
|
|
return globalIndex
|
|
-
|
|
+
|
|
|
|
def UnsteadyFSI(self,FSI_config, FluidSolver, SolidSolver):
|
|
- """
|
|
- Run the unsteady FSI computation by synchronizing the fluid and solid solvers.
|
|
- F/s interface data are exchanged through interface mapping and interpolation (if non mathcing meshes).
|
|
- """
|
|
+ """
|
|
+ Run the unsteady FSI computation by synchronizing the fluid and solid solvers.
|
|
+ F/s interface data are exchanged through interface mapping and interpolation (if non mathcing meshes).
|
|
+ """
|
|
|
|
if self.have_MPI == True:
|
|
- myid = self.comm.Get_rank()
|
|
- numberPart = self.comm.Get_size()
|
|
+ myid = self.comm.Get_rank()
|
|
+ numberPart = self.comm.Get_size()
|
|
else:
|
|
myid = 0
|
|
numberPart = 1
|
|
|
|
- # --- Set some general variables for the unsteady computation --- #
|
|
- deltaT = FSI_config['UNST_TIMESTEP'] # physical time step
|
|
- totTime = FSI_config['UNST_TIME'] # physical simulation time
|
|
- NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
|
|
- FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
|
|
- TimeIterTreshold = 0 # time iteration from which we allow the solid to deform
|
|
-
|
|
- if FSI_config['RESTART_SOL'] == 'YES':
|
|
- startTime = FSI_config['START_TIME']
|
|
- NbTimeIter = ((totTime)/deltaT)-1
|
|
- time = startTime
|
|
- TimeIter = FSI_config['RESTART_ITER']
|
|
- else:
|
|
- NbTimeIter = (totTime/deltaT)-1 # number of time iterations
|
|
- time = 0.0 # initial time
|
|
- TimeIter = 0 # initial time iteration
|
|
-
|
|
- NbTimeIter = int(NbTimeIter) # be sure that NbTimeIter is an integer
|
|
-
|
|
- varCoordNorm = 0.0 # FSI residual
|
|
- FSIConv = False # FSI convergence flag
|
|
-
|
|
- self.MPIPrint('\n**********************************')
|
|
- self.MPIPrint('* Begin unsteady FSI computation *')
|
|
- self.MPIPrint('**********************************\n')
|
|
-
|
|
- # --- Initialize the coupled solution --- #
|
|
- #If restart (DOES NOT WORK YET)
|
|
- if FSI_config['RESTART_SOL'] == 'YES':
|
|
- TimeIterTreshold = -1
|
|
- FluidSolver.setTemporalIteration(TimeIter)
|
|
- if myid == self.rootProcess:
|
|
- SolidSolver.outputDisplacements(FluidSolver.getInterRigidDispArray(), True)
|
|
+ # --- Set some general variables for the unsteady computation --- #
|
|
+ deltaT = FSI_config['UNST_TIMESTEP'] # physical time step
|
|
+ totTime = FSI_config['UNST_TIME'] # physical simulation time
|
|
+ NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
|
|
+ FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
|
|
+ TimeIterTreshold = 0 # time iteration from which we allow the solid to deform
|
|
+
|
|
+ if FSI_config['RESTART_SOL'] == 'YES':
|
|
+ startTime = FSI_config['START_TIME']
|
|
+ NbTimeIter = ((totTime)/deltaT)-1
|
|
+ time = startTime
|
|
+ TimeIter = FSI_config['RESTART_ITER']
|
|
+ else:
|
|
+ NbTimeIter = (totTime/deltaT)-1 # number of time iterations
|
|
+ time = 0.0 # initial time
|
|
+ TimeIter = 0 # initial time iteration
|
|
+
|
|
+ NbTimeIter = int(NbTimeIter) # be sure that NbTimeIter is an integer
|
|
+
|
|
+ varCoordNorm = 0.0 # FSI residual
|
|
+ FSIConv = False # FSI convergence flag
|
|
+
|
|
+ self.MPIPrint('\n**********************************')
|
|
+ self.MPIPrint('* Begin unsteady FSI computation *')
|
|
+ self.MPIPrint('**********************************\n')
|
|
+
|
|
+ # --- Initialize the coupled solution --- #
|
|
+ #If restart (DOES NOT WORK YET)
|
|
+ if FSI_config['RESTART_SOL'] == 'YES':
|
|
+ TimeIterTreshold = -1
|
|
+ FluidSolver.setTemporalIteration(TimeIter)
|
|
+ if myid == self.rootProcess:
|
|
+ SolidSolver.outputDisplacements(FluidSolver.getInterRigidDispArray(), True)
|
|
+ if self.have_MPI == True:
|
|
+ self.comm.barrier()
|
|
+ FluidSolver.setInitialMesh(True)
|
|
+ if myid == self.rootProcess:
|
|
+ SolidSolver.displacementPredictor(FluidSolver.getInterRigidDispArray())
|
|
if self.have_MPI == True:
|
|
- self.comm.barrier()
|
|
- FluidSolver.setInitialMesh(True)
|
|
- if myid == self.rootProcess:
|
|
- SolidSolver.displacementPredictor(FluidSolver.getInterRigidDispArray())
|
|
- if self.have_MPI == True:
|
|
- self.comm.barrier()
|
|
- if myid == self.rootProcess:
|
|
- SolidSolver.updateSolution()
|
|
- #If no restart
|
|
- else:
|
|
- self.MPIPrint('Setting FSI initial conditions')
|
|
+ self.comm.barrier()
|
|
+ if myid == self.rootProcess:
|
|
+ SolidSolver.updateSolution()
|
|
+ #If no restart
|
|
+ else:
|
|
+ self.MPIPrint('Setting FSI initial conditions')
|
|
if myid in self.solidSolverProcessors:
|
|
- SolidSolver.setInitialDisplacements()
|
|
+ SolidSolver.setInitialDisplacements()
|
|
self.getSolidInterfaceDisplacement(SolidSolver)
|
|
- self.interpolateSolidPositionOnFluidMesh(FSI_config)
|
|
- self.setFluidInterfaceVarCoord(FluidSolver)
|
|
- FluidSolver.SetInitialMesh() # if there is an initial deformation in the solid, it has to be communicated to the fluid solver
|
|
- self.MPIPrint('\nFSI initial conditions are set')
|
|
- self.MPIPrint('Beginning time integration\n')
|
|
-
|
|
- # --- External temporal loop --- #
|
|
- while TimeIter <= NbTimeIter:
|
|
-
|
|
- if TimeIter > TimeIterTreshold:
|
|
- NbFSIIter = NbFSIIterMax
|
|
- self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI on time iteration {} ***************'.format(TimeIter))
|
|
- else:
|
|
- NbFSIIter = 1
|
|
-
|
|
- self.FSIIter = 0
|
|
- FSIConv = False
|
|
- FluidSolver.PreprocessExtIter(TimeIter) # set some parameters before temporal fluid iteration
|
|
-
|
|
- # --- Internal FSI loop --- #
|
|
- while self.FSIIter <= (NbFSIIter-1):
|
|
+ self.interpolateSolidPositionOnFluidMesh(FSI_config)
|
|
+ self.setFluidInterfaceVarCoord(FluidSolver)
|
|
+ FluidSolver.SetInitialMesh() # if there is an initial deformation in the solid, it has to be communicated to the fluid solver
|
|
+ self.MPIPrint('\nFSI initial conditions are set')
|
|
+ self.MPIPrint('Beginning time integration\n')
|
|
+
|
|
+ # --- External temporal loop --- #
|
|
+ while TimeIter <= NbTimeIter:
|
|
+
|
|
+ if TimeIter > TimeIterTreshold:
|
|
+ NbFSIIter = NbFSIIterMax
|
|
+ self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI on time iteration {} ***************'.format(TimeIter))
|
|
+ else:
|
|
+ NbFSIIter = 1
|
|
+
|
|
+ self.FSIIter = 0
|
|
+ FSIConv = False
|
|
+ FluidSolver.PreprocessExtIter(TimeIter) # set some parameters before temporal fluid iteration
|
|
|
|
- self.MPIPrint("\n>>>> Time iteration {} / FSI iteration {} <<<<".format(TimeIter,self.FSIIter))
|
|
+ # --- Internal FSI loop --- #
|
|
+ while self.FSIIter <= (NbFSIIter-1):
|
|
|
|
- # --- Mesh morphing step (displacements interpolation, displacements communication, and mesh morpher call) --- #
|
|
- self.interpolateSolidPositionOnFluidMesh(FSI_config)
|
|
+ self.MPIPrint("\n>>>> Time iteration {} / FSI iteration {} <<<<".format(TimeIter,self.FSIIter))
|
|
+
|
|
+ # --- Mesh morphing step (displacements interpolation, displacements communication, and mesh morpher call) --- #
|
|
+ self.interpolateSolidPositionOnFluidMesh(FSI_config)
|
|
self.MPIPrint('\nPerforming dynamic mesh deformation (ALE)...\n')
|
|
self.setFluidInterfaceVarCoord(FluidSolver)
|
|
FluidSolver.DynamicMeshUpdate(TimeIter)
|
|
-
|
|
- # --- Fluid solver call for FSI subiteration --- #
|
|
- self.MPIPrint('\nLaunching fluid solver for one single dual-time iteration...')
|
|
+
|
|
+ # --- Fluid solver call for FSI subiteration --- #
|
|
+ self.MPIPrint('\nLaunching fluid solver for one single dual-time iteration...')
|
|
self.MPIBarrier()
|
|
- FluidSolver.ResetConvergence()
|
|
- FluidSolver.Run()
|
|
+ FluidSolver.ResetConvergence()
|
|
+ FluidSolver.Run()
|
|
self.MPIBarrier()
|
|
|
|
- # --- Surface fluid loads interpolation and communication --- #
|
|
- self.MPIPrint('\nProcessing interface fluid loads...\n')
|
|
+ # --- Surface fluid loads interpolation and communication --- #
|
|
+ self.MPIPrint('\nProcessing interface fluid loads...\n')
|
|
self.MPIBarrier()
|
|
- self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
|
|
+ self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
|
|
self.MPIBarrier()
|
|
- if TimeIter > TimeIterTreshold:
|
|
- self.interpolateFluidLoadsOnSolidMesh(FSI_config)
|
|
- self.setSolidInterfaceLoads(SolidSolver, FSI_config, time)
|
|
+ if TimeIter > TimeIterTreshold:
|
|
+ self.interpolateFluidLoadsOnSolidMesh(FSI_config)
|
|
+ self.setSolidInterfaceLoads(SolidSolver, FSI_config, time)
|
|
|
|
- # --- Solid solver call for FSI subiteration --- #
|
|
- self.MPIPrint('\nLaunching solid solver for a single time iteration...\n')
|
|
+ # --- Solid solver call for FSI subiteration --- #
|
|
+ self.MPIPrint('\nLaunching solid solver for a single time iteration...\n')
|
|
if myid in self.solidSolverProcessors:
|
|
- if FSI_config['CSD_SOLVER'] == 'NATIVE':
|
|
- SolidSolver.timeIteration(time)
|
|
- elif FSI_config['CSD_SOLVER'] == 'METAFOR' or FSI_config['CSD_SOLVER'] == 'GETDP' or FSI_config['CSD_SOLVER'] == 'TESTER':
|
|
- SolidSolver.run(time-deltaT, time)
|
|
-
|
|
- # --- Compute and monitor the FSI residual --- #
|
|
- varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
|
|
- self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
|
|
- if varCoordNorm < FSITolerance:
|
|
- FSIConv = True
|
|
- break
|
|
+ if FSI_config['CSD_SOLVER'] == 'NATIVE':
|
|
+ SolidSolver.timeIteration(time)
|
|
+ elif FSI_config['CSD_SOLVER'] == 'METAFOR' or FSI_config['CSD_SOLVER'] == 'GETDP' or FSI_config['CSD_SOLVER'] == 'TESTER':
|
|
+ SolidSolver.run(time-deltaT, time)
|
|
+
|
|
+ # --- Compute and monitor the FSI residual --- #
|
|
+ varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
|
|
+ self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
|
|
+ if varCoordNorm < FSITolerance:
|
|
+ FSIConv = True
|
|
+ break
|
|
|
|
- # --- Relaxe the solid position --- #
|
|
+ # --- Relaxe the solid position --- #
|
|
self.MPIPrint('\nProcessing interface displacements...\n')
|
|
- self.relaxSolidPosition(FSI_config)
|
|
-
|
|
- self.FSIIter += 1
|
|
- # --- End OF FSI loop --- #
|
|
+ self.relaxSolidPosition(FSI_config)
|
|
+
|
|
+ self.FSIIter += 1
|
|
+ # --- End OF FSI loop --- #
|
|
|
|
self.MPIBarrier()
|
|
|
|
- # --- Update the FSI history file --- #
|
|
- if TimeIter > TimeIterTreshold:
|
|
- self.MPIPrint('\nBGS is converged (strong coupling)')
|
|
- self.writeFSIHistory(TimeIter, time, varCoordNorm, FSIConv)
|
|
-
|
|
- # --- Update, monitor and output the fluid solution before the next time step ---#
|
|
- FluidSolver.Update()
|
|
- FluidSolver.Monitor(TimeIter)
|
|
- FluidSolver.Output(TimeIter)
|
|
-
|
|
- if TimeIter >= TimeIterTreshold:
|
|
- if myid in self.solidSolverProcessors:
|
|
- # --- Output the solid solution before thr next time step --- #
|
|
- SolidSolver.writeSolution(time, self.FSIIter, TimeIter, NbTimeIter)
|
|
-
|
|
- # --- Displacement predictor for the next time step and update of the solid solution --- #
|
|
- self.MPIPrint('\nSolid displacement prediction for next time step')
|
|
- self.displacementPredictor(FSI_config, SolidSolver, deltaT)
|
|
+ # --- Update the FSI history file --- #
|
|
+ if TimeIter > TimeIterTreshold:
|
|
+ self.MPIPrint('\nBGS is converged (strong coupling)')
|
|
+ self.writeFSIHistory(TimeIter, time, varCoordNorm, FSIConv)
|
|
+
|
|
+ # --- Update, monitor and output the fluid solution before the next time step ---#
|
|
+ FluidSolver.Update()
|
|
+ FluidSolver.Monitor(TimeIter)
|
|
+ FluidSolver.Output(TimeIter)
|
|
+
|
|
+ if TimeIter >= TimeIterTreshold:
|
|
+ if myid in self.solidSolverProcessors:
|
|
+ # --- Output the solid solution before thr next time step --- #
|
|
+ SolidSolver.writeSolution(time, self.FSIIter, TimeIter, NbTimeIter)
|
|
+
|
|
+ # --- Displacement predictor for the next time step and update of the solid solution --- #
|
|
+ self.MPIPrint('\nSolid displacement prediction for next time step')
|
|
+ self.displacementPredictor(FSI_config, SolidSolver, deltaT)
|
|
if myid in self.solidSolverProcessors:
|
|
- SolidSolver.updateSolution()
|
|
-
|
|
- TimeIter += 1
|
|
- time += deltaT
|
|
- #--- End of the temporal loop --- #
|
|
+ SolidSolver.updateSolution()
|
|
+
|
|
+ TimeIter += 1
|
|
+ time += deltaT
|
|
+ #--- End of the temporal loop --- #
|
|
|
|
self.MPIBarrier()
|
|
|
|
- self.MPIPrint('\n*************************')
|
|
- self.MPIPrint('* End FSI computation *')
|
|
- self.MPIPrint('*************************\n')
|
|
+ self.MPIPrint('\n*************************')
|
|
+ self.MPIPrint('* End FSI computation *')
|
|
+ self.MPIPrint('*************************\n')
|
|
|
|
def SteadyFSI(self, FSI_config,FluidSolver, SolidSolver):
|
|
- """
|
|
- Runs the steady FSI computation by synchronizing the fluid and solid solver with data exchange at the f/s interface.
|
|
- """
|
|
+ """
|
|
+ Runs the steady FSI computation by synchronizing the fluid and solid solver with data exchange at the f/s interface.
|
|
+ """
|
|
|
|
if self.have_MPI == True:
|
|
- myid = self.comm.Get_rank()
|
|
- numberPart = self.comm.Get_size()
|
|
+ myid = self.comm.Get_rank()
|
|
+ numberPart = self.comm.Get_size()
|
|
else:
|
|
myid = 0
|
|
numberPart = 1
|
|
|
|
- # --- Set some general variables for the steady computation --- #
|
|
- NbIter = FSI_config['NB_EXT_ITER'] # number of fluid iteration at each FSI step
|
|
- NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
|
|
- FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
|
|
- varCoordNorm = 0.0
|
|
-
|
|
- self.MPIPrint('\n********************************')
|
|
- self.MPIPrint('* Begin steady FSI computation *')
|
|
- self.MPIPrint('********************************\n')
|
|
- self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI ***************')
|
|
+ # --- Set some general variables for the steady computation --- #
|
|
+ NbIter = FSI_config['NB_EXT_ITER'] # number of fluid iteration at each FSI step
|
|
+ NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
|
|
+ FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
|
|
+ varCoordNorm = 0.0
|
|
+
|
|
+ self.MPIPrint('\n********************************')
|
|
+ self.MPIPrint('* Begin steady FSI computation *')
|
|
+ self.MPIPrint('********************************\n')
|
|
+ self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI ***************')
|
|
|
|
self.getSolidInterfaceDisplacement(SolidSolver)
|
|
|
|
- # --- External FSI loop --- #
|
|
- self.FSIIter = 0
|
|
- while self.FSIIter < NbFSIIterMax:
|
|
- self.MPIPrint("\n>>>> FSI iteration {} <<<<".format(self.FSIIter))
|
|
- self.MPIPrint('\nLaunching fluid solver for a steady computation...')
|
|
- # --- Fluid solver call for FSI subiteration ---#
|
|
- Iter = 0
|
|
- FluidSolver.ResetConvergence()
|
|
- while Iter < NbIter:
|
|
- FluidSolver.PreprocessExtIter(Iter)
|
|
- FluidSolver.Run()
|
|
- StopIntegration = FluidSolver.Monitor(Iter)
|
|
- FluidSolver.Output(Iter)
|
|
- if StopIntegration:
|
|
- break;
|
|
- Iter += 1
|
|
-
|
|
- # --- Surface fluid loads interpolation and communication ---#
|
|
- self.MPIPrint('\nProcessing interface fluid loads...\n')
|
|
+ # --- External FSI loop --- #
|
|
+ self.FSIIter = 0
|
|
+ while self.FSIIter < NbFSIIterMax:
|
|
+ self.MPIPrint("\n>>>> FSI iteration {} <<<<".format(self.FSIIter))
|
|
+ self.MPIPrint('\nLaunching fluid solver for a steady computation...')
|
|
+ # --- Fluid solver call for FSI subiteration ---#
|
|
+ Iter = 0
|
|
+ FluidSolver.ResetConvergence()
|
|
+ while Iter < NbIter:
|
|
+ FluidSolver.PreprocessExtIter(Iter)
|
|
+ FluidSolver.Run()
|
|
+ StopIntegration = FluidSolver.Monitor(Iter)
|
|
+ FluidSolver.Output(Iter)
|
|
+ if StopIntegration:
|
|
+ break;
|
|
+ Iter += 1
|
|
+
|
|
+ # --- Surface fluid loads interpolation and communication ---#
|
|
+ self.MPIPrint('\nProcessing interface fluid loads...\n')
|
|
self.MPIBarrier()
|
|
- self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
|
|
+ self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
|
|
self.MPIBarrier()
|
|
- self.interpolateFluidLoadsOnSolidMesh(FSI_config)
|
|
- self.setSolidInterfaceLoads(SolidSolver, FSI_config, 0.05)
|
|
-
|
|
- # --- Solid solver call for FSI subiteration --- #
|
|
- self.MPIPrint('\nLaunching solid solver for a static computation...\n')
|
|
+ self.interpolateFluidLoadsOnSolidMesh(FSI_config)
|
|
+ self.setSolidInterfaceLoads(SolidSolver, FSI_config, 0.05)
|
|
+
|
|
+ # --- Solid solver call for FSI subiteration --- #
|
|
+ self.MPIPrint('\nLaunching solid solver for a static computation...\n')
|
|
if myid in self.solidSolverProcessors:
|
|
- if FSI_config['CSD_SOLVER'] == 'NATIVE':
|
|
- SolidSolver.staticComputation()
|
|
+ if FSI_config['CSD_SOLVER'] == 'NATIVE':
|
|
+ SolidSolver.staticComputation()
|
|
else:
|
|
SolidSolver.run(0.0, 0.05)
|
|
- SolidSolver.writeSolution(0.0, self.FSIIter, Iter, NbIter)
|
|
+ SolidSolver.writeSolution(0.0, self.FSIIter, Iter, NbIter)
|
|
|
|
- # --- Compute and monitor the FSI residual --- #
|
|
- varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
|
|
- self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
|
|
+ # --- Compute and monitor the FSI residual --- #
|
|
+ varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
|
|
+ self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
|
|
self.writeFSIHistory(0, 0.0, varCoordNorm, False)
|
|
- if varCoordNorm < FSITolerance:
|
|
- break
|
|
+ if varCoordNorm < FSITolerance:
|
|
+ break
|
|
|
|
# --- Relaxe the solid displacement and update the solid solution --- #
|
|
self.MPIPrint('\nProcessing interface displacements...\n')
|
|
- self.relaxSolidPosition(FSI_config)
|
|
+ self.relaxSolidPosition(FSI_config)
|
|
if myid in self.solidSolverProcessors:
|
|
SolidSolver.updateSolution()
|
|
-
|
|
- # --- Mesh morphing step (displacement interpolation, displacements communication, and mesh morpher call) --- #
|
|
- self.interpolateSolidPositionOnFluidMesh(FSI_config)
|
|
- self.MPIPrint('\nPerforming static mesh deformation...\n')
|
|
- self.setFluidInterfaceVarCoord(FluidSolver)
|
|
- FluidSolver.StaticMeshUpdate()
|
|
- self.FSIIter += 1
|
|
+
|
|
+ # --- Mesh morphing step (displacement interpolation, displacements communication, and mesh morpher call) --- #
|
|
+ self.interpolateSolidPositionOnFluidMesh(FSI_config)
|
|
+ self.MPIPrint('\nPerforming static mesh deformation...\n')
|
|
+ self.setFluidInterfaceVarCoord(FluidSolver)
|
|
+ FluidSolver.StaticMeshUpdate()
|
|
+ self.FSIIter += 1
|
|
|
|
self.MPIBarrier()
|
|
|
|
- self.MPIPrint('\nBGS is converged (strong coupling)')
|
|
- self.MPIPrint(' ')
|
|
- self.MPIPrint('*************************')
|
|
- self.MPIPrint('* End FSI computation *')
|
|
- self.MPIPrint('*************************')
|
|
- self.MPIPrint(' ')
|
|
+ self.MPIPrint('\nBGS is converged (strong coupling)')
|
|
+ self.MPIPrint(' ')
|
|
+ self.MPIPrint('*************************')
|
|
+ self.MPIPrint('* End FSI computation *')
|
|
+ self.MPIPrint('*************************')
|
|
+ self.MPIPrint(' ')
|
|
diff -Naur old/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py new/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py
|
|
--- old/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py 2020-05-01 19:09:18.000000000 +0300
|
|
+++ new/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py 2020-05-10 16:17:07.000000000 +0300
|
|
@@ -174,9 +174,9 @@
|
|
|
|
with open(self.Config_file) as configfile:
|
|
while 1:
|
|
- line = configfile.readline()
|
|
- if not line:
|
|
- break
|
|
+ line = configfile.readline()
|
|
+ if not line:
|
|
+ break
|
|
|
|
# remove line returns
|
|
line = line.strip('\r\n')
|
|
@@ -189,41 +189,41 @@
|
|
this_value = line[1].strip()
|
|
|
|
for case in switch(this_param):
|
|
- #integer values
|
|
- #if case("NB_FSI_ITER") :
|
|
- #self.Config[this_param] = int(this_value)
|
|
- #break
|
|
-
|
|
- #float values
|
|
- if case("DELTA_T") : pass
|
|
- if case("START_TIME") : pass
|
|
- if case("STOP_TIME") : pass
|
|
- if case("SPRING_MASS") : pass
|
|
- if case("INERTIA_FLEXURAL") : pass
|
|
- if case("SPRING_STIFFNESS") : pass
|
|
- if case("SPRING_DAMPING") : pass
|
|
- if case("TORSIONAL_STIFFNESS") : pass
|
|
- if case("TORSIONAL_DAMPING") : pass
|
|
- if case("CORD") : pass
|
|
- if case("FLEXURAL_AXIS") : pass
|
|
- if case("GRAVITY_CENTER") : pass
|
|
- if case("INITIAL_DISP") : pass
|
|
- if case("INITIAL_ANGLE") : pass
|
|
- if case("RHO") :
|
|
- self.Config[this_param] = float(this_value)
|
|
- break
|
|
-
|
|
- #string values
|
|
- if case("TIME_MARCHING") : pass
|
|
- if case("MESH_FILE") : pass
|
|
- if case("CSD_SOLVER") : pass
|
|
- if case("MOVING_MARKER") : pass
|
|
- if case("STRUCT_TYPE") :
|
|
- self.Config[this_param] = this_value
|
|
- break
|
|
+ #integer values
|
|
+ #if case("NB_FSI_ITER") :
|
|
+ #self.Config[this_param] = int(this_value)
|
|
+ #break
|
|
+
|
|
+ #float values
|
|
+ if case("DELTA_T") : pass
|
|
+ if case("START_TIME") : pass
|
|
+ if case("STOP_TIME") : pass
|
|
+ if case("SPRING_MASS") : pass
|
|
+ if case("INERTIA_FLEXURAL") : pass
|
|
+ if case("SPRING_STIFFNESS") : pass
|
|
+ if case("SPRING_DAMPING") : pass
|
|
+ if case("TORSIONAL_STIFFNESS") : pass
|
|
+ if case("TORSIONAL_DAMPING") : pass
|
|
+ if case("CORD") : pass
|
|
+ if case("FLEXURAL_AXIS") : pass
|
|
+ if case("GRAVITY_CENTER") : pass
|
|
+ if case("INITIAL_DISP") : pass
|
|
+ if case("INITIAL_ANGLE") : pass
|
|
+ if case("RHO") :
|
|
+ self.Config[this_param] = float(this_value)
|
|
+ break
|
|
+
|
|
+ #string values
|
|
+ if case("TIME_MARCHING") : pass
|
|
+ if case("MESH_FILE") : pass
|
|
+ if case("CSD_SOLVER") : pass
|
|
+ if case("MOVING_MARKER") : pass
|
|
+ if case("STRUCT_TYPE") :
|
|
+ self.Config[this_param] = this_value
|
|
+ break
|
|
|
|
- if case():
|
|
- print(this_param + " is an invalid option !")
|
|
+ if case():
|
|
+ print(this_param + " is an invalid option !")
|
|
break
|
|
|
|
def __readSU2Mesh(self):
|
|
@@ -233,78 +233,78 @@
|
|
print('Opened mesh file ' + self.Mesh_file + '.')
|
|
while 1:
|
|
line = meshfile.readline()
|
|
- if not line:
|
|
- break
|
|
+ if not line:
|
|
+ break
|
|
|
|
- pos = line.find('NDIM')
|
|
- if pos != -1:
|
|
- line = line.strip('\r\n')
|
|
+ pos = line.find('NDIM')
|
|
+ if pos != -1:
|
|
+ line = line.strip('\r\n')
|
|
line = line.split("=",1)
|
|
- self.nDim = int(line[1])
|
|
- continue
|
|
-
|
|
- pos = line.find('NELEM')
|
|
- if pos != -1:
|
|
- line = line.strip('\r\n')
|
|
+ self.nDim = int(line[1])
|
|
+ continue
|
|
+
|
|
+ pos = line.find('NELEM')
|
|
+ if pos != -1:
|
|
+ line = line.strip('\r\n')
|
|
line = line.split("=",1)
|
|
- self.nElem = int(line[1])
|
|
- continue
|
|
+ self.nElem = int(line[1])
|
|
+ continue
|
|
|
|
- pos = line.find('NPOIN')
|
|
- if pos != -1:
|
|
- line = line.strip('\r\n')
|
|
+ pos = line.find('NPOIN')
|
|
+ if pos != -1:
|
|
+ line = line.strip('\r\n')
|
|
line = line.split("=",1)
|
|
- self.nPoint = int(line[1])
|
|
+ self.nPoint = int(line[1])
|
|
for iPoint in range(self.nPoint):
|
|
- self.node.append(Point())
|
|
- line = meshfile.readline()
|
|
- line = line.strip('\r\n')
|
|
- line = line.split(' ',self.nDim)
|
|
- x = float(line[0])
|
|
- y = float(line[1])
|
|
+ self.node.append(Point())
|
|
+ line = meshfile.readline()
|
|
+ line = line.strip('\r\n')
|
|
+ line = line.split(' ',self.nDim)
|
|
+ x = float(line[0])
|
|
+ y = float(line[1])
|
|
z = 0.0
|
|
- if self.nDim == 3:
|
|
- z = float(line[2])
|
|
- self.node[iPoint].SetCoord((x,y,z))
|
|
+ if self.nDim == 3:
|
|
+ z = float(line[2])
|
|
+ self.node[iPoint].SetCoord((x,y,z))
|
|
self.node[iPoint].SetCoord0((x,y,z))
|
|
- self.node[iPoint].SetCoord_n((x,y,z))
|
|
- continue
|
|
+ self.node[iPoint].SetCoord_n((x,y,z))
|
|
+ continue
|
|
|
|
- pos = line.find('NMARK')
|
|
- if pos != -1:
|
|
- line = line.strip('\r\n')
|
|
+ pos = line.find('NMARK')
|
|
+ if pos != -1:
|
|
+ line = line.strip('\r\n')
|
|
line = line.split("=",1)
|
|
- self.nMarker = int(line[1])
|
|
- continue
|
|
+ self.nMarker = int(line[1])
|
|
+ continue
|
|
|
|
- pos = line.find('MARKER_TAG')
|
|
- if pos != -1:
|
|
- line = line.strip('\r\n')
|
|
- line = line.replace(" ", "")
|
|
+ pos = line.find('MARKER_TAG')
|
|
+ if pos != -1:
|
|
+ line = line.strip('\r\n')
|
|
+ line = line.replace(" ", "")
|
|
line = line.split("=",1)
|
|
- markerTag = line[1]
|
|
- if markerTag == self.FSI_marker:
|
|
- self.markers[markerTag] = []
|
|
- line = meshfile.readline()
|
|
- line = line.strip('\r\n')
|
|
- line = line.split("=",1)
|
|
- nElem = int(line[1])
|
|
- for iElem in range(nElem):
|
|
- line = meshfile.readline()
|
|
- line = line.strip('\r\n')
|
|
- line = line.split(' ',1)
|
|
- elemType = int(line[0])
|
|
- if elemType == 3:
|
|
- nodes = line[1].split(' ', 1)
|
|
- if not int(nodes[0]) in self.markers[markerTag]:
|
|
- self.markers[markerTag].append(int(nodes[0]))
|
|
- if not int(nodes[1]) in self.markers[markerTag]:
|
|
- self.markers[markerTag].append(int(nodes[1]))
|
|
- else:
|
|
- print("Element type {} is not recognized !!".format(elemType))
|
|
- continue
|
|
- else:
|
|
- continue
|
|
+ markerTag = line[1]
|
|
+ if markerTag == self.FSI_marker:
|
|
+ self.markers[markerTag] = []
|
|
+ line = meshfile.readline()
|
|
+ line = line.strip('\r\n')
|
|
+ line = line.split("=",1)
|
|
+ nElem = int(line[1])
|
|
+ for iElem in range(nElem):
|
|
+ line = meshfile.readline()
|
|
+ line = line.strip('\r\n')
|
|
+ line = line.split(' ',1)
|
|
+ elemType = int(line[0])
|
|
+ if elemType == 3:
|
|
+ nodes = line[1].split(' ', 1)
|
|
+ if not int(nodes[0]) in self.markers[markerTag]:
|
|
+ self.markers[markerTag].append(int(nodes[0]))
|
|
+ if not int(nodes[1]) in self.markers[markerTag]:
|
|
+ self.markers[markerTag].append(int(nodes[1]))
|
|
+ else:
|
|
+ print("Element type {} is not recognized !!".format(elemType))
|
|
+ continue
|
|
+ else:
|
|
+ continue
|
|
|
|
print("Number of dimensions: {}".format(self.nDim))
|
|
print("Number of elements: {}".format(self.nElem))
|
|
@@ -441,23 +441,23 @@
|
|
Coord_n = self.node[iPoint].GetCoord_n()
|
|
|
|
if self.Unsteady:
|
|
- r = Coord_n - self.centerOfRotation_n
|
|
- else:
|
|
- r = Coord - self.centerOfRotation
|
|
+ r = Coord_n - self.centerOfRotation_n
|
|
+ else:
|
|
+ r = Coord - self.centerOfRotation
|
|
|
|
- rotCoord = rotMatrix.dot(r)
|
|
+ rotCoord = rotMatrix.dot(r)
|
|
|
|
newCoord = newCenter + rotCoord
|
|
newVel[0] = Centerdot[0]+psidot*(newCoord[1]-newCenter[1])
|
|
- newVel[1] = Centerdot[1]-psidot*(newCoord[0]-newCenter[0])
|
|
- newVel[2] = Centerdot[2]+0.0
|
|
+ newVel[1] = Centerdot[1]-psidot*(newCoord[0]-newCenter[0])
|
|
+ newVel[2] = Centerdot[2]+0.0
|
|
|
|
self.node[iPoint].SetCoord((newCoord[0], newCoord[1], newCoord[2]))
|
|
self.node[iPoint].SetVel((newVel[0], newVel[1], newVel[2]))
|
|
|
|
- if initialize:
|
|
- self.node[iPoint].SetCoord_n((newCoord[0], newCoord[1], newCoord[2]))
|
|
- self.node[iPoint].SetVel_n((newVel[0], newVel[1], newVel[2]))
|
|
+ if initialize:
|
|
+ self.node[iPoint].SetCoord_n((newCoord[0], newCoord[1], newCoord[2]))
|
|
+ self.node[iPoint].SetVel_n((newVel[0], newVel[1], newVel[2]))
|
|
|
|
self.centerOfRotation = np.copy(newCenter)
|
|
|
|
diff -Naur old/SU2_PY/FSI/io/FSI_config.py new/SU2_PY/FSI/io/FSI_config.py
|
|
--- old/SU2_PY/FSI/io/FSI_config.py 2020-05-01 19:09:18.000000000 +0300
|
|
+++ new/SU2_PY/FSI/io/FSI_config.py 2020-05-10 16:17:07.000000000 +0300
|
|
@@ -58,23 +58,23 @@
|
|
self.readConfig()
|
|
|
|
def __str__(self):
|
|
- tempString = str()
|
|
- for key, value in self._ConfigContent.items():
|
|
- tempString += "{} = {}\n".format(key,value)
|
|
- return tempString
|
|
+ tempString = str()
|
|
+ for key, value in self._ConfigContent.items():
|
|
+ tempString += "{} = {}\n".format(key,value)
|
|
+ return tempString
|
|
|
|
def __getitem__(self,key):
|
|
- return self._ConfigContent[key]
|
|
+ return self._ConfigContent[key]
|
|
|
|
def __setitem__(self, key, value):
|
|
- self._ConfigContent[key] = value
|
|
+ self._ConfigContent[key] = value
|
|
|
|
def readConfig(self):
|
|
input_file = open(self.ConfigFileName)
|
|
while 1:
|
|
- line = input_file.readline()
|
|
- if not line:
|
|
- break
|
|
+ line = input_file.readline()
|
|
+ if not line:
|
|
+ break
|
|
# remove line returns
|
|
line = line.strip('\r\n')
|
|
# make sure it has useful data
|
|
@@ -86,46 +86,46 @@
|
|
this_value = line[1].strip()
|
|
|
|
for case in switch(this_param):
|
|
- #integer values
|
|
- if case("NDIM") : pass
|
|
- #if case("MESH_DEF_LIN_ITER") : pass
|
|
- #if case("MESH_DEF_NONLIN_ITER") : pass
|
|
- if case("RESTART_ITER") : pass
|
|
- if case("NB_EXT_ITER") : pass
|
|
- if case("NB_FSI_ITER") :
|
|
- self._ConfigContent[this_param] = int(this_value)
|
|
- break
|
|
+ #integer values
|
|
+ if case("NDIM") : pass
|
|
+ #if case("MESH_DEF_LIN_ITER") : pass
|
|
+ #if case("MESH_DEF_NONLIN_ITER") : pass
|
|
+ if case("RESTART_ITER") : pass
|
|
+ if case("NB_EXT_ITER") : pass
|
|
+ if case("NB_FSI_ITER") :
|
|
+ self._ConfigContent[this_param] = int(this_value)
|
|
+ break
|
|
|
|
- #float values
|
|
+ #float values
|
|
if case("RBF_RADIUS") : pass
|
|
- if case("AITKEN_PARAM") : pass
|
|
- if case("START_TIME") : pass
|
|
- if case("UNST_TIMESTEP") : pass
|
|
- if case("UNST_TIME") : pass
|
|
- if case("FSI_TOLERANCE") :
|
|
- self._ConfigContent[this_param] = float(this_value)
|
|
- break
|
|
-
|
|
- #string values
|
|
- if case("CFD_CONFIG_FILE_NAME") : pass
|
|
- if case("CSD_SOLVER") : pass
|
|
- if case("CSD_CONFIG_FILE_NAME") : pass
|
|
- if case("RESTART_SOL") : pass
|
|
- if case("MATCHING_MESH") : pass
|
|
+ if case("AITKEN_PARAM") : pass
|
|
+ if case("START_TIME") : pass
|
|
+ if case("UNST_TIMESTEP") : pass
|
|
+ if case("UNST_TIME") : pass
|
|
+ if case("FSI_TOLERANCE") :
|
|
+ self._ConfigContent[this_param] = float(this_value)
|
|
+ break
|
|
+
|
|
+ #string values
|
|
+ if case("CFD_CONFIG_FILE_NAME") : pass
|
|
+ if case("CSD_SOLVER") : pass
|
|
+ if case("CSD_CONFIG_FILE_NAME") : pass
|
|
+ if case("RESTART_SOL") : pass
|
|
+ if case("MATCHING_MESH") : pass
|
|
if case("MESH_INTERP_METHOD") : pass
|
|
- if case("DISP_PRED") : pass
|
|
- if case("AITKEN_RELAX") : pass
|
|
- if case("TIME_MARCHING") : pass
|
|
- if case("INTERNAL_FLOW") :
|
|
- #if case("MESH_DEF_METHOD") : pass
|
|
- self._ConfigContent[this_param] = this_value
|
|
- break
|
|
-
|
|
- if case():
|
|
- print(this_param + " is an invalid option !")
|
|
- break
|
|
- #end for
|
|
-
|
|
+ if case("DISP_PRED") : pass
|
|
+ if case("AITKEN_RELAX") : pass
|
|
+ if case("TIME_MARCHING") : pass
|
|
+ if case("INTERNAL_FLOW") :
|
|
+ #if case("MESH_DEF_METHOD") : pass
|
|
+ self._ConfigContent[this_param] = this_value
|
|
+ break
|
|
+
|
|
+ if case():
|
|
+ print(this_param + " is an invalid option !")
|
|
+ break
|
|
+ #end for
|
|
+
|
|
|
|
|
|
#def dump()
|