sandbox/cselcuk/InterfaceGrains.cpp

    /**
    # Coupling interface for Grains3D and Basilisk 
    */
    
    #include "Grains_BuilderFactory.H"
    #include "InterfaceGrains.h"
    
    #ifdef __cplusplus
    extern "C" {
    #endif
      
      static GrainsCoupledWithFluid * grains = NULL;
      
      void Init_Grains (double fluid_density, const bool b_restart,
            const bool b_initializeClonePer,
            const double grid_size,
    	const bool is_solidsolver_parallel,
    	const int my_rank, const int nb_procs) {
    
        string simulation_file = "Grains/simul.xml";
        
        ReaderXML::initialize();
            
        string simulation_file_exe = Grains_BuilderFactory::init (simulation_file, my_rank, is_solidsolver_parallel ? nb_procs : 1);
      
        DOMElement* rootNode = ReaderXML::getRoot (simulation_file_exe);
        
        // cout << "simulation_file_exe=:"<< simulation_file_exe  <<endl;
        // cout << "rootNode: " << rootNode << " on pid()= " << my_rank  << endl;
        
        grains = Grains_BuilderFactory::createCoupledWithFluid (rootNode, fluid_density, grid_size);
    
        // cout << "grain = Grains_BuilderFactory:" << grains << "pid()=" << my_rank  << endl;
    
        if ( b_restart ) grains->setReloadSame();
        grains->Construction (rootNode);
        // cout << "grain->Construction ok" << "on pid()= " << my_rank  << endl;
        grains->Forces (rootNode);
        // cout << "grain->Forces ok" << "on pid()= " << my_rank  << endl;
        grains->Chargement (rootNode);
        // cout << "grain->Chargement ok " << "on pid()= " << my_rank  << endl;
        if ( b_initializeClonePer ) grains->initializeClonesPeriodiques();
    
        ReaderXML::terminate();
         
        cout << "Construction of Grains completed" << endl;
      }
    
      void Simu_Grains (const bool predictor, const bool isPredictorCorrector, const bool explicit_added_mass) {
        grains->Simulation (predictor, isPredictorCorrector, explicit_added_mass);
    	
      }
    
      void Data_GrainsToCstruct (struct BasiliskDataStructure * b, const int m) {
        grains->WriteParticulesInFluid (b);
      }
    
      void Data_CstructToGrains (struct BasiliskDataStructure * b) {};
    
      void Setdt_Grains (double const dtfluid) {
        grains->set_timeStep (dtfluid);
      }
      
      void Setdt_AddedMassGrains (double dtfluid) {
        grains->set_ExplicitAddedMasstimeStep (dtfluid);
      } 
    
      void Setviscosity_Grains (double const viscosity) {
        grains->setFluidViscosity (viscosity);
      }
    
      void SaveResults_Grains (const int counter, int * restarted_simu) {
        int cc = counter ;
        if ((cc == 0) || (*restarted_simu)) {
          if (*restarted_simu)
    	cc--;
          grains->setInitialCycleNumber (cc);
          grains->InitialPostProcessing();
    
          *restarted_simu = 0;
        }
        else
          grains->doPostProcessing();
    
      }
    
      /* Check that Paraview writer is activated 
         ------------------------------------------*/
      void checkParaviewPostProcessing_Grains (char * solid_resDir ) {
        
        grains->checkParaviewPostProcessing ("grains", solid_resDir, true);
      }
    
      void Update_Velocity_Grains (struct BasiliskDataStructure * b, bool explicit_added_mass) {
        grains->UpdateParticulesVelocities (b, explicit_added_mass);
      }
    
       void ActivateExplicitAddedMass (bool restart) {
        grains->AddExplicitAddedMass( restart, "" );
      }
      
      void InitializeExplicitAddedMass (bool restart, char * solid_resDir) {
        grains->InitializeExplicitAddedMassRestart (restart, solid_resDir);
      }
      
    #ifdef __cplusplus
    }
    #endif