mirror of
https://github.com/ParticulateFlow/CFDEMcoupling-PFM.git
synced 2025-12-08 06:37:44 +00:00
release on 2012-11-27_14-31-53
This commit is contained in:
82
README
Normal file
82
README
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
CFDEMcoupling - Open Source CFD-DEM coupling
|
||||||
|
|
||||||
|
CFDEMcoupling is part of the CFDEMproject
|
||||||
|
www.cfdem.com
|
||||||
|
Christoph Goniva, christoph.goniva@cfdem.com
|
||||||
|
Copyright 2009-2012 JKU Linz
|
||||||
|
Copyright 2012- DCS Computing GmbH, Linz
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of CFDEMcoupling.
|
||||||
|
|
||||||
|
CFDEMcoupling is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 3 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
CFDEMcoupling 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 General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with CFDEMcoupling; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Description
|
||||||
|
This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS
|
||||||
|
and OpenFOAM. Note: this code is not part of OpenFOAM (see DISCLAIMER).
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
CFDEM coupling provides an open source parallel coupled CFD-DEM framework
|
||||||
|
combining the strengths of LIGGGHTS DEM code and the Open Source
|
||||||
|
CFD package OpenFOAM(R)(*). The CFDEMcoupling toolbox allows to expand
|
||||||
|
standard CFD solvers of OpenFOAM(R)(*) to include a coupling to the DEM
|
||||||
|
code LIGGGHTS. In this toolbox the particle representation within the
|
||||||
|
CFD solver is organized by "cloud" classes. Key functionalities are organised
|
||||||
|
in sub-models (e.g. force models, data exchange models, etc.) which can easily
|
||||||
|
be selected and combined by dictionary settings.
|
||||||
|
|
||||||
|
The coupled solvers run fully parallel on distributed-memory clusters.
|
||||||
|
|
||||||
|
Features are:
|
||||||
|
|
||||||
|
- its modular approach allows users to easily implement new models
|
||||||
|
- its MPI parallelization enables to use it for large scale problems
|
||||||
|
- the "forum"_lws on CFD-DEM gives the possibility to exchange with other
|
||||||
|
users / developers
|
||||||
|
- the use of GIT allows to easily update to the latest version
|
||||||
|
- basic documentation is provided
|
||||||
|
|
||||||
|
The file structure:
|
||||||
|
|
||||||
|
- "src" directory including the source files of the coupling toolbox and models
|
||||||
|
- "applications" directory including the solver files for coupled CFD-DEM simulations
|
||||||
|
- "doc" directory including the documentation of CFDEMcoupling
|
||||||
|
- "tutorials" directory including basic tutorial cases showing the functionality
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Details on installation are given on the "www.cfdem.com"
|
||||||
|
|
||||||
|
The functionality of this CFD-DEM framwork is described via "tutorial cases" showing
|
||||||
|
how to use different solvers and models.
|
||||||
|
|
||||||
|
CFDEMcoupling stands for Computational Fluid Dynamics (CFD) -
|
||||||
|
Discrete Element Method (DEM) coupling.
|
||||||
|
|
||||||
|
CFDEMcoupling is an open-source code, distributed freely under the terms of the
|
||||||
|
GNU Public License (GPL).
|
||||||
|
|
||||||
|
Core development of CFDEMcoupling is done by
|
||||||
|
Christoph Goniva and Christoph Kloss, both at DCS Computing GmbH, 2012
|
||||||
|
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
(*) "OpenFOAM(R)"_of is a registered trade mark of Silicon Graphics
|
||||||
|
International Corp. This offering is not affiliated, approved or endorsed by
|
||||||
|
Silicon Graphics International Corp., the producer of the OpenFOAM(R) software
|
||||||
|
and owner of the OpenFOAM(R) trademark.
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
Binary file not shown.
Binary file not shown.
@ -33,7 +33,7 @@ turboEngineM2MProps
|
|||||||
{
|
{
|
||||||
turboEngineProps
|
turboEngineProps
|
||||||
{
|
{
|
||||||
treeSearch false;
|
treeSearch true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</PRE>
|
</PRE>
|
||||||
|
|||||||
@ -30,7 +30,7 @@ turboEngineM2MProps
|
|||||||
\{
|
\{
|
||||||
turboEngineProps
|
turboEngineProps
|
||||||
\{
|
\{
|
||||||
treeSearch false;
|
treeSearch true;
|
||||||
\}
|
\}
|
||||||
\} :pre
|
\} :pre
|
||||||
|
|
||||||
|
|||||||
@ -20,18 +20,33 @@ $(forceModels)/forceModel/forceModel.C
|
|||||||
$(forceModels)/forceModel/newForceModel.C
|
$(forceModels)/forceModel/newForceModel.C
|
||||||
$(forceModels)/noDrag/noDrag.C
|
$(forceModels)/noDrag/noDrag.C
|
||||||
$(forceModels)/DiFeliceDrag/DiFeliceDrag.C
|
$(forceModels)/DiFeliceDrag/DiFeliceDrag.C
|
||||||
|
$(forceModels)/DiFeliceDragNLift/DiFeliceDragNLift.C
|
||||||
$(forceModels)/GidaspowDrag/GidaspowDrag.C
|
$(forceModels)/GidaspowDrag/GidaspowDrag.C
|
||||||
$(forceModels)/SchillerNaumannDrag/SchillerNaumannDrag.C
|
$(forceModels)/SchillerNaumannDrag/SchillerNaumannDrag.C
|
||||||
$(forceModels)/Archimedes/Archimedes.C
|
$(forceModels)/Archimedes/Archimedes.C
|
||||||
$(forceModels)/ArchimedesIB/ArchimedesIB.C
|
$(forceModels)/ArchimedesIB/ArchimedesIB.C
|
||||||
$(forceModels)/interface/interface.C
|
$(forceModels)/interface/interface.C
|
||||||
$(forceModels)/ShirgaonkarIB/ShirgaonkarIB.C
|
$(forceModels)/ShirgaonkarIB/ShirgaonkarIB.C
|
||||||
|
$(forceModels)/fieldTimeAverage/fieldTimeAverage.C
|
||||||
|
$(forceModels)/fieldBound/fieldBound.C
|
||||||
|
$(forceModels)/volWeightedAverage/volWeightedAverage.C
|
||||||
|
$(forceModels)/totalMomentumExchange/totalMomentumExchange.C
|
||||||
$(forceModels)/KochHillDrag/KochHillDrag.C
|
$(forceModels)/KochHillDrag/KochHillDrag.C
|
||||||
|
$(forceModels)/BeetstraDrag/multiphaseFlowBasic/multiphaseFlowBasic.C
|
||||||
|
$(forceModels)/BeetstraDrag/BeetstraDrag.C
|
||||||
|
$(forceModels)/LaEuScalarLiquid/LaEuScalarLiquid.C
|
||||||
$(forceModels)/LaEuScalarTemp/LaEuScalarTemp.C
|
$(forceModels)/LaEuScalarTemp/LaEuScalarTemp.C
|
||||||
|
$(forceModels)/LaEuScalarDust/LaEuScalarDust.C
|
||||||
$(forceModels)/virtualMassForce/virtualMassForce.C
|
$(forceModels)/virtualMassForce/virtualMassForce.C
|
||||||
$(forceModels)/gradPForce/gradPForce.C
|
$(forceModels)/gradPForce/gradPForce.C
|
||||||
|
$(forceModels)/gradULiftForce/gradULiftForce.C
|
||||||
$(forceModels)/viscForce/viscForce.C
|
$(forceModels)/viscForce/viscForce.C
|
||||||
$(forceModels)/MeiLift/MeiLift.C
|
$(forceModels)/MeiLift/MeiLift.C
|
||||||
|
$(forceModels)/KochHillDragNLift/KochHillDragNLift.C
|
||||||
|
$(forceModels)/solidsPressureForce/solidsPressureForce.C
|
||||||
|
$(forceModels)/periodicPressure/periodicPressure.C
|
||||||
|
$(forceModels)/periodicPressureControl/periodicPressureControl.C
|
||||||
|
$(forceModels)/averageSlipVel/averageSlipVel.C
|
||||||
|
|
||||||
$(forceModelsMS)/forceModelMS/forceModelMS.C
|
$(forceModelsMS)/forceModelMS/forceModelMS.C
|
||||||
$(forceModelsMS)/forceModelMS/newForceModelMS.C
|
$(forceModelsMS)/forceModelMS/newForceModelMS.C
|
||||||
@ -42,6 +57,7 @@ $(IOModels)/IOModel/newIOModel.C
|
|||||||
$(IOModels)/noIO/noIO.C
|
$(IOModels)/noIO/noIO.C
|
||||||
$(IOModels)/basicIO/basicIO.C
|
$(IOModels)/basicIO/basicIO.C
|
||||||
$(IOModels)/trackIO/trackIO.C
|
$(IOModels)/trackIO/trackIO.C
|
||||||
|
$(IOModels)/sophIO/sophIO.C
|
||||||
|
|
||||||
$(voidFractionModels)/voidFractionModel/voidFractionModel.C
|
$(voidFractionModels)/voidFractionModel/voidFractionModel.C
|
||||||
$(voidFractionModels)/voidFractionModel/newVoidFractionModel.C
|
$(voidFractionModels)/voidFractionModel/newVoidFractionModel.C
|
||||||
@ -57,22 +73,25 @@ $(locateModels)/locateModel/newLocateModel.C
|
|||||||
$(locateModels)/standardSearch/standardSearch.C
|
$(locateModels)/standardSearch/standardSearch.C
|
||||||
$(locateModels)/engineSearch/engineSearch.C
|
$(locateModels)/engineSearch/engineSearch.C
|
||||||
$(locateModels)/turboEngineSearch/turboEngineSearch.C
|
$(locateModels)/turboEngineSearch/turboEngineSearch.C
|
||||||
|
$(locateModels)/turboEngineSearchM2M/turboEngineSearchM2M.C
|
||||||
$(locateModels)/engineSearchIB/engineSearchIB.C
|
$(locateModels)/engineSearchIB/engineSearchIB.C
|
||||||
|
|
||||||
|
|
||||||
$(meshMotionModels)/meshMotionModel/meshMotionModel.C
|
$(meshMotionModels)/meshMotionModel/meshMotionModel.C
|
||||||
$(meshMotionModels)/meshMotionModel/newMeshMotionModel.C
|
$(meshMotionModels)/meshMotionModel/newMeshMotionModel.C
|
||||||
$(meshMotionModels)/noMeshMotion/noMeshMotion.C
|
$(meshMotionModels)/noMeshMotion/noMeshMotion.C
|
||||||
|
$(meshMotionModels)/DEMdrivenMeshMotion/DEMdrivenMeshMotion.C
|
||||||
|
|
||||||
$(momCoupleModels)/momCoupleModel/momCoupleModel.C
|
$(momCoupleModels)/momCoupleModel/momCoupleModel.C
|
||||||
$(momCoupleModels)/momCoupleModel/newMomCoupleModel.C
|
$(momCoupleModels)/momCoupleModel/newMomCoupleModel.C
|
||||||
$(momCoupleModels)/explicitCouple/explicitCouple.C
|
$(momCoupleModels)/explicitCouple/explicitCouple.C
|
||||||
|
$(momCoupleModels)/explicitCoupleSource/explicitCoupleSource.C
|
||||||
$(momCoupleModels)/implicitCouple/implicitCouple.C
|
$(momCoupleModels)/implicitCouple/implicitCouple.C
|
||||||
$(momCoupleModels)/noCouple/noCouple.C
|
$(momCoupleModels)/noCouple/noCouple.C
|
||||||
|
|
||||||
$(regionModels)/regionModel/regionModel.C
|
$(regionModels)/regionModel/regionModel.C
|
||||||
$(regionModels)/regionModel/newRegionModel.C
|
$(regionModels)/regionModel/newRegionModel.C
|
||||||
$(regionModels)/allRegion/allRegion.C
|
$(regionModels)/allRegion/allRegion.C
|
||||||
|
$(regionModels)/differentialRegion/differentialRegion.C
|
||||||
|
|
||||||
$(dataExchangeModels)/dataExchangeModel/dataExchangeModel.C
|
$(dataExchangeModels)/dataExchangeModel/dataExchangeModel.C
|
||||||
$(dataExchangeModels)/dataExchangeModel/newDataExchangeModel.C
|
$(dataExchangeModels)/dataExchangeModel/newDataExchangeModel.C
|
||||||
@ -80,6 +99,7 @@ $(dataExchangeModels)/oneWayVTK/oneWayVTK.C
|
|||||||
$(dataExchangeModels)/twoWayFiles/twoWayFiles.C
|
$(dataExchangeModels)/twoWayFiles/twoWayFiles.C
|
||||||
$(dataExchangeModels)/noDataExchange/noDataExchange.C
|
$(dataExchangeModels)/noDataExchange/noDataExchange.C
|
||||||
$(dataExchangeModels)/twoWayMPI/twoWayMPI.C
|
$(dataExchangeModels)/twoWayMPI/twoWayMPI.C
|
||||||
|
$(dataExchangeModels)/twoWayM2M/twoWayM2M.C
|
||||||
|
|
||||||
$(averagingModels)/averagingModel/averagingModel.C
|
$(averagingModels)/averagingModel/averagingModel.C
|
||||||
$(averagingModels)/averagingModel/newAveragingModel.C
|
$(averagingModels)/averagingModel/newAveragingModel.C
|
||||||
|
|||||||
@ -13,6 +13,7 @@ EXE_INC = \
|
|||||||
-I$(LIB_SRC)/lagrangian/basic/lnInclude \
|
-I$(LIB_SRC)/lagrangian/basic/lnInclude \
|
||||||
-I$(LIB_SRC)/OpenFOAM/containers/HashTables/labelHashSet \
|
-I$(LIB_SRC)/OpenFOAM/containers/HashTables/labelHashSet \
|
||||||
-I$(CFDEM_LIGGGHTS_SRC_DIR) \
|
-I$(CFDEM_LIGGGHTS_SRC_DIR) \
|
||||||
|
-I$(CFDEM_M2MLIB_PATH) \
|
||||||
|
|
||||||
LIB_LIBS = \
|
LIB_LIBS = \
|
||||||
$(PLIBS) \
|
$(PLIBS) \
|
||||||
@ -24,4 +25,6 @@ LIB_LIBS = \
|
|||||||
-llagrangian \
|
-llagrangian \
|
||||||
-lmpi_cxx \
|
-lmpi_cxx \
|
||||||
-L$(CFDEM_LIGGGHTS_SRC_DIR) \
|
-L$(CFDEM_LIGGGHTS_SRC_DIR) \
|
||||||
-l$(CFDEM_LIGGGHTS_LIB_NAME)
|
-l$(CFDEM_LIGGGHTS_LIB_NAME) \
|
||||||
|
-L$(CFDEM_M2MLIB_PATH) \
|
||||||
|
-lcouple
|
||||||
|
|||||||
Binary file not shown.
@ -112,16 +112,18 @@ twoWayM2M::twoWayM2M
|
|||||||
checkTSsize();
|
checkTSsize();
|
||||||
|
|
||||||
// m2m stuff
|
// m2m stuff
|
||||||
|
firstRun_=true;
|
||||||
lmp2foam_ = new Many2Many(MPI_COMM_WORLD);
|
lmp2foam_ = new Many2Many(MPI_COMM_WORLD);
|
||||||
lmp2foam_vec_ = new Many2Many(MPI_COMM_WORLD);
|
lmp2foam_vec_ = new Many2Many(MPI_COMM_WORLD);
|
||||||
foam2lmp_vec_ = new Many2Many(MPI_COMM_WORLD);
|
foam2lmp_vec_ = new Many2Many(MPI_COMM_WORLD);
|
||||||
nlocal_lammps_ = -1;
|
nlocal_lammps_ = -1;
|
||||||
id_lammps_ = NULL;
|
id_lammps_ = NULL;
|
||||||
id_lammpsComm_ = NULL;
|
//id_lammpsComm_ = NULL;
|
||||||
id_lammps_vec_ = NULL;
|
id_lammps_vec_ = NULL;
|
||||||
nlocal_foam_ = -1;
|
nlocal_foam_ = -1;
|
||||||
id_foam_ = NULL;
|
id_foam_ = NULL;
|
||||||
id_foam_vec_ = NULL;
|
id_foam_vec_ = NULL;
|
||||||
|
pos_lammps_=NULL;
|
||||||
nlocal_foam_lost_ = -1;
|
nlocal_foam_lost_ = -1;
|
||||||
id_foam_lost_ = NULL;
|
id_foam_lost_ = NULL;
|
||||||
id_foam_lost_all = NULL;
|
id_foam_lost_all = NULL;
|
||||||
@ -130,7 +132,6 @@ twoWayM2M::twoWayM2M
|
|||||||
lost_pos_all = NULL;
|
lost_pos_all = NULL;
|
||||||
cellID_foam_ = NULL;
|
cellID_foam_ = NULL;
|
||||||
pos_foam_ = NULL;
|
pos_foam_ = NULL;
|
||||||
//Foam::dataExchangeModel::allocateArray(idHashTable_,0,100000);//liggghts_get_maxtag(lmp)); // define idHashTable
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -139,7 +140,7 @@ twoWayM2M::twoWayM2M
|
|||||||
twoWayM2M::~twoWayM2M()
|
twoWayM2M::~twoWayM2M()
|
||||||
{
|
{
|
||||||
free(id_lammps_);
|
free(id_lammps_);
|
||||||
delete[] id_lammpsComm_;
|
//delete[] id_lammpsComm_;
|
||||||
delete[] id_lammps_vec_;
|
delete[] id_lammps_vec_;
|
||||||
delete[] id_foam_vec_;
|
delete[] id_foam_vec_;
|
||||||
delete[] id_foam_;
|
delete[] id_foam_;
|
||||||
@ -170,7 +171,7 @@ void twoWayM2M::getData
|
|||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
char* charName = wordToChar(name);
|
char* charName = wordToChar(name);
|
||||||
if ( type == "vector-atom" && name != "x")
|
if ( type == "vector-atom")// && name != "x")
|
||||||
{
|
{
|
||||||
//if (nlocal_lammps_>0){
|
//if (nlocal_lammps_>0){
|
||||||
double **tata_ = (double **) lammps_extract_atom(lmp,charName);
|
double **tata_ = (double **) lammps_extract_atom(lmp,charName);
|
||||||
@ -181,8 +182,9 @@ void twoWayM2M::getData
|
|||||||
lmp2foam_vec_->exchange(tata_, &(field[0][0]));
|
lmp2foam_vec_->exchange(tata_, &(field[0][0]));
|
||||||
}*/
|
}*/
|
||||||
//for (int i = 0; i < nlocal_foam_; i++)
|
//for (int i = 0; i < nlocal_foam_; i++)
|
||||||
|
// Pout << "hihi getData: " << name <<"=" << field[i][0]<<","<<field[i][1]<<","<<field[i][2] <<endl;
|
||||||
// Pout << name <<"=" << tata_[i][0]<<","<<tata_[i][1]<<","<<tata_[i][2] <<endl;
|
// Pout << name <<"=" << tata_[i][0]<<","<<tata_[i][1]<<","<<tata_[i][2] <<endl;
|
||||||
}else if (name != "x"){
|
}else {//if (name != "x"){
|
||||||
tmp_ = (double *) lammps_extract_atom(lmp,charName);
|
tmp_ = (double *) lammps_extract_atom(lmp,charName);
|
||||||
lmp2foam_->exchange(tmp_, &(field[0][0]));
|
lmp2foam_->exchange(tmp_, &(field[0][0]));
|
||||||
//for (int i = 0; i < nlocal_foam_; i++)
|
//for (int i = 0; i < nlocal_foam_; i++)
|
||||||
@ -320,6 +322,7 @@ bool Foam::twoWayM2M::couple() const
|
|||||||
// m2m stuff
|
// m2m stuff
|
||||||
particleCloud_.clockM().start(4,"CoupleSyncIDs()");
|
particleCloud_.clockM().start(4,"CoupleSyncIDs()");
|
||||||
syncIDs();
|
syncIDs();
|
||||||
|
firstRun_=false;
|
||||||
particleCloud_.clockM().stop("CoupleSyncIDs()");
|
particleCloud_.clockM().stop("CoupleSyncIDs()");
|
||||||
|
|
||||||
// give nr of particles to cloud
|
// give nr of particles to cloud
|
||||||
@ -349,54 +352,180 @@ int Foam::twoWayM2M::getNumberOfClumps() const
|
|||||||
|
|
||||||
void Foam::twoWayM2M::syncIDs() const
|
void Foam::twoWayM2M::syncIDs() const
|
||||||
{
|
{
|
||||||
|
//MPI_Barrier(MPI_COMM_WORLD);
|
||||||
|
//Pout << "== syncIDs " << endl;
|
||||||
|
|
||||||
particleCloud_.clockM().start(5,"recv_DEM_ids");
|
particleCloud_.clockM().start(5,"recv_DEM_ids");
|
||||||
// get data from lammps
|
// get data from lammps
|
||||||
|
int nlocal_lammps_old=nlocal_lammps_;
|
||||||
nlocal_lammps_ = *((int *) lammps_extract_global(lmp,"nlocal"));
|
nlocal_lammps_ = *((int *) lammps_extract_global(lmp,"nlocal"));
|
||||||
id_lammps_ = (int *) lammps_extract_atom(lmp,"id");
|
|
||||||
|
// weak form to detect lmp proc change - this will cause problems!!!
|
||||||
|
//bool comRun=false;
|
||||||
|
//if(nlocal_lammps_old != nlocal_lammps_) comRun=true;
|
||||||
|
//MPI_Allreduce(&comRun, &firstRun_, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
|
||||||
|
|
||||||
|
int* id_lammps_sync;
|
||||||
|
double** pos_lammps_sync;
|
||||||
|
if(firstRun_) // do not forget iterator !
|
||||||
|
{
|
||||||
|
// IDs for vectors
|
||||||
|
id_lammps_ = (int *) lammps_extract_atom(lmp,"id");
|
||||||
|
|
||||||
|
delete [] id_lammps_vec_;
|
||||||
|
Foam::dataExchangeModel::allocateArray(id_lammps_vec_,0,nlocal_lammps_*3);
|
||||||
|
for (int i = 0; i < nlocal_lammps_; i++)
|
||||||
|
for (int j=0;j<3;j++)
|
||||||
|
id_lammps_vec_[i*3+j] = id_lammps_[i]*3+j;
|
||||||
|
|
||||||
|
Foam::dataExchangeModel::allocateArray(pos_lammps_,-1.,3,nlocal_lammps_); // do I need this???
|
||||||
|
pos_lammps_ = (double **) lammps_extract_atom(lmp,"x");
|
||||||
|
|
||||||
|
//for (int i = 0; i < nlocal_lammps_; i++){
|
||||||
|
// vector pp;
|
||||||
|
// for (int j = 0; j < 3; j++) pp[j]=pos_lammps_[i][j];
|
||||||
|
// Pout << "pp=" << pp << endl;
|
||||||
|
//}
|
||||||
|
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
// re-arrange data using map
|
||||||
|
Foam::dataExchangeModel::allocateArray(id_lammps_sync,-1.,nlocal_lammps_);
|
||||||
|
id_lammps_sync = (int *) lammps_extract_atom(lmp,"id");
|
||||||
|
|
||||||
|
delete [] id_lammps_vec_;
|
||||||
|
Foam::dataExchangeModel::allocateArray(id_lammps_vec_,0,nlocal_lammps_*3);
|
||||||
|
for (int i = 0; i < nlocal_lammps_; i++)
|
||||||
|
for (int j=0;j<3;j++)
|
||||||
|
id_lammps_vec_[i*3+j] = id_lammps_sync[i]*3+j;
|
||||||
|
|
||||||
|
// make setup of m2m
|
||||||
|
lmp2foam_->setup(nlocal_lammps_,id_lammps_sync,nlocal_foam_,id_foam_);
|
||||||
|
lmp2foam_vec_->setup(nlocal_lammps_*3,id_lammps_vec_,nlocal_foam_*3,id_foam_vec_);
|
||||||
|
foam2lmp_vec_->setup(nlocal_foam_*3,id_foam_vec_,nlocal_lammps_*3,id_lammps_vec_);
|
||||||
|
|
||||||
|
Foam::dataExchangeModel::allocateArray(id_lammps_,-1,nlocal_foam_); // probably not necessary
|
||||||
|
lmp2foam_->exchange(id_lammps_sync, id_lammps_);
|
||||||
|
|
||||||
|
|
||||||
|
Foam::dataExchangeModel::allocateArray(pos_lammps_sync,-1.,3,nlocal_lammps_); // probably not necessary
|
||||||
|
pos_lammps_sync = (double **) lammps_extract_atom(lmp,"x");
|
||||||
|
|
||||||
|
// find better solution here!!!
|
||||||
|
double** gugu;
|
||||||
|
Foam::dataExchangeModel::allocateArray(gugu,-1.,3*nlocal_foam_,1);
|
||||||
|
Foam::dataExchangeModel::allocateArray(pos_lammps_,-1.,3,nlocal_foam_);
|
||||||
|
lmp2foam_vec_->exchange(&(pos_lammps_sync[0][0]), &(gugu[0][0]));
|
||||||
|
|
||||||
|
// try the same with getData
|
||||||
|
//double** gugu;
|
||||||
|
//Foam::dataExchangeModel::allocateArray(gugu,-1.,3,nlocal_foam_);
|
||||||
|
//Foam::dataExchangeModel::allocateArray(pos_lammps_,-1.,3,nlocal_foam_);
|
||||||
|
//getData("x","vector-atom",gugu,1);
|
||||||
|
|
||||||
|
// conversion of array (should not be necessary if above problem is solved)
|
||||||
|
for (int i = 0; i < nlocal_foam_; i++)
|
||||||
|
for (int j = 0; j < 3; j++)
|
||||||
|
pos_lammps_[i][j]=gugu[0][i*3+j];
|
||||||
|
|
||||||
|
/*// test communication - works!!!
|
||||||
|
int* llv;
|
||||||
|
int* ovv;
|
||||||
|
Many2Many* l2f = new Many2Many(MPI_COMM_WORLD);
|
||||||
|
double** gaga;
|
||||||
|
if(Pstream::myProcNo()==0)
|
||||||
|
{
|
||||||
|
Foam::dataExchangeModel::allocateArray(llv,0,6);
|
||||||
|
Foam::dataExchangeModel::allocateArray(ovv,0,1);
|
||||||
|
for(int i=0;i<6;i++)
|
||||||
|
llv[i]=i+1;
|
||||||
|
ovv[0]=-1;
|
||||||
|
l2f->setup(6,llv,0,ovv);
|
||||||
|
l2f->exchange(&(pos_lammps_sync[0][0]), &(gaga[0][0]));
|
||||||
|
}else{
|
||||||
|
Foam::dataExchangeModel::allocateArray(llv,0,1);
|
||||||
|
Foam::dataExchangeModel::allocateArray(ovv,0,6);
|
||||||
|
for(int i=0;i<6;i++)
|
||||||
|
ovv[i]=i+1;
|
||||||
|
llv[0]=-1;
|
||||||
|
l2f->setup(0,llv,6,ovv);
|
||||||
|
|
||||||
|
double** gugu;
|
||||||
|
Foam::dataExchangeModel::allocateArray(gaga,-1.,3,2);
|
||||||
|
Foam::dataExchangeModel::allocateArray(gugu,-1.,3,2);
|
||||||
|
l2f->exchange(&(pos_lammps_sync[0][0]), &(gugu[0][0]));
|
||||||
|
|
||||||
|
// this does not work! -conversion needed!
|
||||||
|
//for (int i = 0; i < 2; i++)
|
||||||
|
// Pout << "getDataXX: " << "v" <<"=" << gugu[i][0]<<","<< gugu[i][1]<<","<< gugu[i][2]<<endl;
|
||||||
|
|
||||||
|
// conversion of array
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
for (int j = 0; j < 3; j++)
|
||||||
|
gaga[i][j]=gugu[0][i*3+j];
|
||||||
|
|
||||||
|
// output
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
Pout << "getData3: " << "v" <<"=" << gaga[i][0]<<","<< gaga[i][1]<<","<< gaga[i][2]<<endl;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
}
|
||||||
|
particleCloud_.clockM().stop("recv_DEM_ids");
|
||||||
|
|
||||||
// make a copy of liggghts ID array
|
// make a copy of liggghts ID array
|
||||||
delete [] id_lammpsComm_;
|
/*delete [] id_lammpsComm_;
|
||||||
Foam::dataExchangeModel::allocateArray(id_lammpsComm_,0,nlocal_lammps_);
|
Foam::dataExchangeModel::allocateArray(id_lammpsComm_,0,nlocal_lammps_);
|
||||||
for(int i=0;i<nlocal_lammps_;i++) id_lammpsComm_[i]=id_lammps_[i];
|
for(int i=0;i<nlocal_lammps_;i++) id_lammpsComm_[i]=id_lammps_[i];*/
|
||||||
|
|
||||||
Foam::dataExchangeModel::allocateArray(pos_lammps_,-1.,3,nlocal_lammps_); // is this the right allocate???
|
|
||||||
pos_lammps_ = (double **) lammps_extract_atom(lmp,"x");
|
|
||||||
particleCloud_.clockM().stop("recv_DEM_ids");
|
|
||||||
|
|
||||||
particleCloud_.clockM().start(6,"locateParticle()");
|
particleCloud_.clockM().start(6,"locateParticle()");
|
||||||
locateParticle();
|
locateParticle();
|
||||||
particleCloud_.clockM().stop("locateParticle()");
|
particleCloud_.clockM().stop("locateParticle()");
|
||||||
|
|
||||||
|
//for (int i = 0; i < nlocal_lammps_; i++)
|
||||||
|
// Pout << "getData3: " << "v" <<"=" << pos_lammps_[i][0]<<","<<pos_lammps_[i][1]<<","<<pos_lammps_[i][2] <<endl;
|
||||||
|
|
||||||
// output
|
// output
|
||||||
/*Info << "LAMMPS " << endl;
|
/*Info << "LAMMPS " << endl;
|
||||||
for (int i = 0; i < nlocal_lammps_; i++)
|
for (int i = 0; i < nlocal_lammps_; i++)
|
||||||
{
|
{
|
||||||
Pout << "id_lammps_[" << i << "]=" << id_lammps_[i] << " - "<<endl;
|
if(firstRun_)
|
||||||
//Pout << "pos_lammps_ radius [" << i << "]=" << pos_lammps_[i] << endl;
|
{
|
||||||
|
Pout << "id_lammps_[" << i << "]=" << id_lammps_[i] << " - "<<endl;
|
||||||
|
}else{
|
||||||
|
Pout << "id_lammps_sync[" << i << "]=" << id_lammps_sync[i] << " - "<<endl;
|
||||||
|
}
|
||||||
}*/
|
}*/
|
||||||
/*for (int i = 0; i < nlocal_lammps_*3; i++)
|
/*for (int i = 0; i < nlocal_lammps_*3; i++)
|
||||||
{
|
{
|
||||||
Pout << "id_lammps_vec_[" << i << "]=" << id_lammps_vec_[i] << " - "<<endl;
|
Pout << "id_lammps_vec_[" << i << "]=" << id_lammps_vec_[i] << " - "<<endl;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/*Info << "FOAM "<< endl;
|
/*Info << "FOAM "<< endl;
|
||||||
for (int i = 0; i < nlocal_foam_; i++)
|
for (int i = 0; i < nlocal_foam_; i++)
|
||||||
{
|
{
|
||||||
Pout << "id_foam_[" << i << "]=" << id_foam_[i] << " - "<<endl;
|
Pout << "id_foam_[" << i << "]=" << id_foam_[i] << " - "<<endl;
|
||||||
//Pout << "pos_foam_ radius [" << i << "]=" << pos_foam_[i] << endl;
|
|
||||||
}*/
|
}*/
|
||||||
/*for (int i = 0; i < nlocal_foam_*3; i++)
|
/*for (int i = 0; i < nlocal_foam_*3; i++)
|
||||||
{
|
{
|
||||||
Pout << "id_foam_vec_[" << i << "]=" << id_foam_vec_[i] << " - "<<endl;
|
Pout << "id_foam_vec_[" << i << "]=" << id_foam_vec_[i] << " - "<<endl;
|
||||||
}*/
|
}*/
|
||||||
Pout << "nlocal_lammps_=" << nlocal_lammps_ << endl;
|
Pout << couplingStep_ << "st nlocal_lammps_=" << nlocal_lammps_ << endl;
|
||||||
Pout << "nlocal_foam_=" << nlocal_foam_ << endl;
|
Pout << couplingStep_ << "st nlocal_foam_=" << nlocal_foam_ << endl;
|
||||||
|
|
||||||
// communicate lmp->foam
|
// communicate lmp->foam
|
||||||
particleCloud_.clockM().start(11,"setup_Comm");
|
particleCloud_.clockM().start(11,"setup_Comm");
|
||||||
lmp2foam_->setup(nlocal_lammps_,id_lammpsComm_,nlocal_foam_,id_foam_);
|
if(firstRun_)
|
||||||
lmp2foam_vec_->setup(nlocal_lammps_*3,id_lammps_vec_,nlocal_foam_*3,id_foam_vec_);
|
{
|
||||||
foam2lmp_vec_->setup(nlocal_foam_*3,id_foam_vec_,nlocal_lammps_*3,id_lammps_vec_);
|
//lmp2foam_->setup(nlocal_lammps_,id_lammpsComm_,nlocal_foam_,id_foam_);
|
||||||
|
lmp2foam_->setup(nlocal_lammps_,id_lammps_,nlocal_foam_,id_foam_);
|
||||||
|
lmp2foam_vec_->setup(nlocal_lammps_*3,id_lammps_vec_,nlocal_foam_*3,id_foam_vec_);
|
||||||
|
foam2lmp_vec_->setup(nlocal_foam_*3,id_foam_vec_,nlocal_lammps_*3,id_lammps_vec_);
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
//lmp2foam_->setup(nlocal_lammps_,id_lammpsComm_,nlocal_foam_,id_foam_);
|
||||||
|
lmp2foam_->setup(nlocal_lammps_,id_lammps_sync,nlocal_foam_,id_foam_);
|
||||||
|
lmp2foam_vec_->setup(nlocal_lammps_*3,id_lammps_vec_,nlocal_foam_*3,id_foam_vec_);
|
||||||
|
foam2lmp_vec_->setup(nlocal_foam_*3,id_foam_vec_,nlocal_lammps_*3,id_lammps_vec_);
|
||||||
|
}
|
||||||
particleCloud_.clockM().stop("setup_Comm");
|
particleCloud_.clockM().stop("setup_Comm");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -428,9 +557,6 @@ void Foam::twoWayM2M::locateParticle() const
|
|||||||
delete [] id_foam_vec_;
|
delete [] id_foam_vec_;
|
||||||
Foam::dataExchangeModel::allocateArray(id_foam_vec_,0,nop*3);
|
Foam::dataExchangeModel::allocateArray(id_foam_vec_,0,nop*3);
|
||||||
|
|
||||||
delete [] id_lammps_vec_;
|
|
||||||
Foam::dataExchangeModel::allocateArray(id_lammps_vec_,0,nop*3);
|
|
||||||
|
|
||||||
delete [] cellID_foam_;
|
delete [] cellID_foam_;
|
||||||
Foam::dataExchangeModel::allocateArray(cellID_foam_,0,nop);
|
Foam::dataExchangeModel::allocateArray(cellID_foam_,0,nop);
|
||||||
delete [] pos_foam_;
|
delete [] pos_foam_;
|
||||||
@ -446,10 +572,11 @@ void Foam::twoWayM2M::locateParticle() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if global nr of particles changed:
|
|
||||||
// realloc idHashTable_
|
|
||||||
|
|
||||||
// loop all lmp particles
|
// loop all lmp particles
|
||||||
|
int iterate;
|
||||||
|
if(firstRun_) iterate=nlocal_lammps_;
|
||||||
|
else iterate=nlocal_foam_;
|
||||||
|
|
||||||
nlocal_foam_ = 0;
|
nlocal_foam_ = 0;
|
||||||
nlocal_foam_lost_ = 0;
|
nlocal_foam_lost_ = 0;
|
||||||
vector pos;
|
vector pos;
|
||||||
@ -457,16 +584,15 @@ void Foam::twoWayM2M::locateParticle() const
|
|||||||
label searchCellID;
|
label searchCellID;
|
||||||
|
|
||||||
particleCloud_.clockM().start(7,"locate_Stage1");
|
particleCloud_.clockM().start(7,"locate_Stage1");
|
||||||
for (int i = 0; i < nlocal_lammps_; i++)
|
|
||||||
|
for (int i = 0; i < iterate; i++)
|
||||||
{
|
{
|
||||||
pos = vector(pos_lammps_[i][0],pos_lammps_[i][1],pos_lammps_[i][2]);
|
pos = vector(pos_lammps_[i][0],pos_lammps_[i][1],pos_lammps_[i][2]);
|
||||||
searchCellID = -1;//idHashTable_[id_lammps_[i]];
|
searchCellID = -1;
|
||||||
|
//Pout << "stage1 looking for particle pos="<< pos << endl;
|
||||||
|
|
||||||
cellID = particleCloud_.locateM().findSingleCell(pos,searchCellID);
|
cellID = particleCloud_.locateM().findSingleCell(pos,searchCellID);
|
||||||
|
|
||||||
// IDs for vectors
|
|
||||||
for (int j=0;j<3;j++)
|
|
||||||
id_lammps_vec_[i*3+j] = id_lammps_[i]*3+j;
|
|
||||||
|
|
||||||
// found particle on cfd proc
|
// found particle on cfd proc
|
||||||
if (cellID >= 0)
|
if (cellID >= 0)
|
||||||
{
|
{
|
||||||
@ -481,11 +607,8 @@ void Foam::twoWayM2M::locateParticle() const
|
|||||||
}
|
}
|
||||||
cellID_foam_[nlocal_foam_] = cellID;
|
cellID_foam_[nlocal_foam_] = cellID;
|
||||||
|
|
||||||
// cell id hash table
|
|
||||||
//idHashTable_[id_lammps_[i]]=cellID;
|
|
||||||
|
|
||||||
nlocal_foam_ += 1;
|
nlocal_foam_ += 1;
|
||||||
//Pout << "found particle at pos=" << pos << endl;
|
//Pout << "stage1 found particle at pos=" << pos << endl;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -502,14 +625,23 @@ void Foam::twoWayM2M::locateParticle() const
|
|||||||
|
|
||||||
// using allgather to allreduce lost particles
|
// using allgather to allreduce lost particles
|
||||||
particleCloud_.clockM().start(8,"locate_Stage2");
|
particleCloud_.clockM().start(8,"locate_Stage2");
|
||||||
|
|
||||||
|
// we could add this here - but some arrays must be init
|
||||||
|
//int lost_all;
|
||||||
|
//MPI_Allreduce(&nlocal_foam_lost_, &lost_all, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
|
||||||
|
//if(lost_all>0)
|
||||||
|
|
||||||
|
|
||||||
int nlocal_foam_lost_all = LAMMPS_NS::MPI_Allgather_Vector(lost_pos_, nlocal_foam_lost_*3, lost_pos_all, MPI_COMM_WORLD)/3;
|
int nlocal_foam_lost_all = LAMMPS_NS::MPI_Allgather_Vector(lost_pos_, nlocal_foam_lost_*3, lost_pos_all, MPI_COMM_WORLD)/3;
|
||||||
LAMMPS_NS::MPI_Allgather_Vector(id_foam_lost_, nlocal_foam_lost_, id_foam_lost_all, MPI_COMM_WORLD);
|
LAMMPS_NS::MPI_Allgather_Vector(id_foam_lost_, nlocal_foam_lost_, id_foam_lost_all, MPI_COMM_WORLD);
|
||||||
|
Info << couplingStep_ << "st nlocal_foam_lost_all=" << nlocal_foam_lost_all << endl;
|
||||||
|
|
||||||
// locate lost particles
|
// locate lost particles
|
||||||
for (int i = 0; i < nlocal_foam_lost_all; i++)
|
for (int i = 0; i < nlocal_foam_lost_all; i++)
|
||||||
{
|
{
|
||||||
pos = vector(lost_pos_all[i*3+0],lost_pos_all[i*3+1],lost_pos_all[i*3+2]);
|
pos = vector(lost_pos_all[i*3+0],lost_pos_all[i*3+1],lost_pos_all[i*3+2]);
|
||||||
searchCellID = -1;//idHashTable_[id_foam_lost_all[i]];
|
//Pout << "stage2 looking for particle pos="<< pos << endl;
|
||||||
|
searchCellID = -1;
|
||||||
particleCloud_.clockM().start(9,"findSingleCell");
|
particleCloud_.clockM().start(9,"findSingleCell");
|
||||||
cellID = particleCloud_.locateM().findSingleCell(pos,searchCellID);
|
cellID = particleCloud_.locateM().findSingleCell(pos,searchCellID);
|
||||||
particleCloud_.clockM().stop("findSingleCell");
|
particleCloud_.clockM().stop("findSingleCell");
|
||||||
@ -531,10 +663,8 @@ void Foam::twoWayM2M::locateParticle() const
|
|||||||
// mark that ID was finally found
|
// mark that ID was finally found
|
||||||
id_foam_lost_all[i]=-1;
|
id_foam_lost_all[i]=-1;
|
||||||
|
|
||||||
// cell id hash table
|
|
||||||
//idHashTable_[id_foam_lost_all[i]]=cellID;
|
|
||||||
|
|
||||||
nlocal_foam_ += 1;
|
nlocal_foam_ += 1;
|
||||||
|
//Pout << "stage2 found particle at pos=" << pos << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
particleCloud_.clockM().stop("locate_Stage2");
|
particleCloud_.clockM().stop("locate_Stage2");
|
||||||
@ -560,7 +690,7 @@ void Foam::twoWayM2M::locateParticle() const
|
|||||||
// re-arrange IDs for vectors
|
// re-arrange IDs for vectors
|
||||||
for (int k=0;k<3;k++)
|
for (int k=0;k<3;k++)
|
||||||
{
|
{
|
||||||
id_lammps_vec_[j*3+k] = id_lammps_vec_[(nlocal_lammps_-1)*3+k];
|
id_lammps_vec_[j*3+k] = id_lammps_vec_[nlocal_lammps_*3+k];
|
||||||
}
|
}
|
||||||
|
|
||||||
nlocal_lammps_ -= 1;
|
nlocal_lammps_ -= 1;
|
||||||
@ -570,7 +700,7 @@ void Foam::twoWayM2M::locateParticle() const
|
|||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
particleCloud_.clockM().stop("locate_Stage3");*/
|
particleCloud_.clockM().stop("locate_Stage3");*/
|
||||||
|
|
||||||
/*int gaga;
|
/*int gaga;
|
||||||
MPI_Allreduce(&nlocal_foam_, &gaga, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
|
MPI_Allreduce(&nlocal_foam_, &gaga, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
|
||||||
|
|||||||
@ -89,12 +89,13 @@ private:
|
|||||||
dictionary propsDict_;
|
dictionary propsDict_;
|
||||||
|
|
||||||
// new vars
|
// new vars
|
||||||
|
mutable bool firstRun_;
|
||||||
mutable Many2Many *lmp2foam_;
|
mutable Many2Many *lmp2foam_;
|
||||||
mutable Many2Many *lmp2foam_vec_;
|
mutable Many2Many *lmp2foam_vec_;
|
||||||
mutable Many2Many *foam2lmp_vec_;
|
mutable Many2Many *foam2lmp_vec_;
|
||||||
mutable int nlocal_lammps_;
|
mutable int nlocal_lammps_;
|
||||||
mutable int *id_lammps_;
|
mutable int *id_lammps_;
|
||||||
mutable int *id_lammpsComm_;
|
//mutable int *id_lammpsComm_;
|
||||||
mutable int *id_lammps_vec_;
|
mutable int *id_lammps_vec_;
|
||||||
mutable int nlocal_foam_;
|
mutable int nlocal_foam_;
|
||||||
mutable int *id_foam_;
|
mutable int *id_foam_;
|
||||||
@ -110,9 +111,6 @@ private:
|
|||||||
mutable int *cellID_foam_;
|
mutable int *cellID_foam_;
|
||||||
mutable double *pos_foam_;
|
mutable double *pos_foam_;
|
||||||
|
|
||||||
// optimization
|
|
||||||
//mutable int *idHashTable_;
|
|
||||||
|
|
||||||
// variables
|
// variables
|
||||||
int me;
|
int me;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user