Source code for Mordicus.Modules.Safran.Containers.InitialConditions.InitialCondition

# -*- coding: utf-8 -*-
import os
from mpi4py import MPI
if MPI.COMM_WORLD.Get_size() > 1: # pragma: no cover
    os.environ["OMP_NUM_THREADS"] = "1"
    os.environ["OPENBLAS_NUM_THREADS"] = "1"
    os.environ["MKL_NUM_THREADS"] = "1"
    os.environ["VECLIB_MAXIMUM_THREADS"] = "1"
    os.environ["NUMEXPR_NUM_THREADS"] = "1"
import numpy as np

from Mordicus.Core.Containers.InitialConditions.InitialConditionBase import InitialConditionBase
from mpi4py import MPI


[docs]class InitialCondition(InitialConditionBase): """ Class modeling an initial condition Attributes ---------- dataType : dict dictionary with solutionName (str) as keys and the type of initial condition (str: "scalar" or "vector") initialSnapshot : dict dictionary with solutionName (str) as keys and the values of the initial condition (float or np.ndarray of floats of size (numberOfDofs,)) reducedInitialSnapshot : dict dictionary with solutionName (str) as keys and the values of the reduced initial snapshot (np.ndarray of floats of size (numberOfModes,)) """ def __init__(self): super(InitialCondition, self).__init__() self.dataType = {} self.initialSnapshot = {} self.reducedInitialSnapshot = {}
[docs] def SetDataType(self, solutionName, dataTy): """ Sets the type of initial condition Parameters ---------- solutionName : str name of the corresponding solution dataTy : str type of initial condition (scalar" or "vector") """ self.dataType[solutionName] = dataTy
[docs] def GetDataType(self, solutionName): """ Returns the type of initial condition for a given solutionName Returns ------- str type of initial condition (scalar" or "vector") """ return self.dataType[solutionName]
[docs] def SetInitialSnapshot(self, solutionName, initialSnapshot): """ Sets the initial condition Parameters ---------- solutionName : str name of the corresponding solution initialSnapshot : float or np.ndarray of floats of size (numberOfDofs,) values of the initial condition """ self.initialSnapshot[solutionName] = initialSnapshot
[docs] def SetReducedInitialSnapshot(self, solutionName, reducedInitialSnapshot): """ Sets the reduced initial snapshot Parameters ---------- solutionName : str name of the corresponding solution reducedInitialSnapshot : np.ndarray of floats of size (numberOfModes,) values of the reduced initial snapshot """ self.reducedInitialSnapshot[solutionName] = reducedInitialSnapshot
[docs] def GetReducedInitialSnapshot(self, solutionName): """ Returns the reduced initial snapshot Parameters ---------- solutionName : str name of the corresponding solution Returns ------- np.ndarray of floats of size (numberOfModes,) values of the reduced initial snapshot """ return self.reducedInitialSnapshot[solutionName]
[docs] def ReduceInitialSnapshot(self, reducedOrderBases, snapshotCorrelationOperator = None): """ Computes and sets the reduced initial snapshot Parameters ---------- reducedOrderBases : dict(str: np.ndarray) dictionary with solutionNames (str) as keys and reducedOrderBases (np.ndarray of size (numberOfModes, numberOfDOFs)) as values snapshotCorrelationOperator : scipy.sparse.csr, optional correlation operator between the snapshots """ for solutionName in self.initialSnapshot.keys(): reducedOrderBasis = reducedOrderBases[solutionName] if self.dataType[solutionName] == "scalar": if self.initialSnapshot[solutionName] == 0.: self.SetReducedInitialSnapshot(solutionName, np.zeros(reducedOrderBasis.shape[0])) continue else: initVector = self.initialSnapshot[solutionName] * np.ones(reducedOrderBasis.shape[1]) else: initVector = self.initialSnapshot[solutionName] if snapshotCorrelationOperator is None: matVecProduct = initVector else: matVecProduct = snapshotCorrelationOperator[solutionName].dot(initVector) localScalarProduct = np.dot(reducedOrderBasis, matVecProduct) globalScalarProduct = np.zeros(localScalarProduct.shape) MPI.COMM_WORLD.Allreduce([localScalarProduct, MPI.DOUBLE], [globalScalarProduct, MPI.DOUBLE]) self.SetReducedInitialSnapshot(solutionName, globalScalarProduct)
def __getstate__(self): state = {} state["initialSnapshot"] = None state["reducedInitialSnapshot"] = self.reducedInitialSnapshot return state def __str__(self): res = "Initial Condition" return res
if __name__ == "__main__":# pragma: no cover from Mordicus import RunTestFile RunTestFile(__file__)