Source code for Mordicus.Modules.Cemosis.IO.FeelppSolutionReader
from os import path as osp
import numpy as np
from Mordicus.Core.IO.SolutionReaderBase import SolutionReaderBase
import feelpp
[docs]class FeelppSolutionReader(SolutionReaderBase):
    def __init__(self, mesh, space="Pch", order=1):
        self.mesh = mesh
        self.Xh = feelpp.functionSpace(mesh.GetInternalStorage(), space, order)
    def __init__(self, mesh, space):
        self.mesh = mesh
        self.Xh = space
        
[docs]    def ReadSnapshotComponent(self, fieldName, time=0, primality=True):
        u = self.Xh.element()
        u.load(fieldName,"")
        up = u.to_petsc().vec()
        #assert(u.size() == up.getSize())
        return up[:]
        return up.getArray() # should use this to avoid copy but currently crash 
[docs]    def WriteSolution(self, fileName, solution, fieldStructure=None, fieldName="", nameInFile=None, append=False):
        """write solution to disk
        Args:
            fileName (_type_): name of the file
            solution (_type_): field to be saved
            fieldStructure (_type_, optional): _description_. Defaults to None.
            fieldName (str, optional): name of the field. Defaults to "".
            nameInFile (_type_, optional): _description_. Defaults to None.
            append (bool, optional): _description_. Defaults to False.
        """        
        b = feelpp.Backend(feelpp.Environment.worldCommPtr())
        v = b.newVector(self.Xh.mapPtr())
        assert(solution.shape[0] == v.size())
        for i in range(solution.shape[0]):
            v.set(i, solution[i])
        u = self.Xh.elementFromVec(v,0)
        path, name = osp.split(fileName)
        #self.e.addP1c(name, u)
        u.save(path, name) 
[docs]    def WriteReducedOrderBasis(self, fileName, solutionStructure, reducedOrderBasis, fieldName):
        self.e = feelpp.exporter(self.mesh, "reducedbasis", "change_coords_only")
        for i in range(reducedOrderBasis[fieldName].shape[0]):
            filepath = f"{fileName}_{i}.h5"
            self.WriteSolution(filepath, reducedOrderBasis[fieldName][i]) 
        #self.e.save()
[docs]    def ReadReducedOrderBasis(self, fileName, solutionStructure, fieldName):
        i = 0
        base = []
        while True:
            filepath = f"{fileName}_{i}.h5"
            try:
                base.append(self.ReadSnapshotComponent(filepath))
            except:
                break
        return {fieldName: np.concatenate(base, axis=0)}