Source code for Muscat.FE.WeakForms.NumericalWeakForm
# -*- coding: utf-8 -*-## This file is subject to the terms and conditions defined in# file 'LICENSE.txt', which is part of this source code package.#importnumpyasnpfromsympy.core.containersimportTuplefromsympyimportSymbol,FunctionfromMuscat.FE.SymWeakFormimportGetNormalUseCpp=False# Include the correct implementation depending on the UseCpp valuetry:UseCpp=True# CPP integrationfromMuscat.FE.WeakForms.NativeNumericalWeakFormimport(PyWeakTerm,PyWeakMonom,PyWeakForm,)except:UseCpp=Falseprint("Warning NativeNumericalWeakForm (cpp) not available, using python variant")# PYTHON integrationfromMuscat.FE.WeakForms.PythonNumericalWeakFromimport(PyWeakTerm,PyWeakMonom,PyWeakForm,)
[docs]defSymWeakMonomToNumWeakMono(exp):fromsympy.core.mulimportMulfromsympy.core.powerimportPowifexp.func==Mul:res=PyWeakMonom()forarginexp.args:ifarg.is_Number:res.prefactor=float(arg)continueifisinstance(arg,Pow):term=ConverTermToProd(arg.args[0])iftermisNone:print(type(arg.args[0]))print(arg.args[0])raise(Exception("Unable to treat term "+str(arg.args[0])))foriinrange(arg.args[1]):res.AddProd(term)continueterm=ConverTermToProd(arg)iftermisnotNone:# res.prod.append(term)res.AddProd(term)continueprint(type(arg))print(arg)raisereturnreselse:# only one term no productres=PyWeakMonom()term=ConverTermToProd(exp)iftermisnotNone:res.AddProd(term)returnres
__cached_normal=GetNormal(3)
[docs]defConverTermToProd(arg):ifisinstance(arg,Symbol):t=PyWeakTerm()t.constant=Truet.derDegree=0t.fieldName=str(arg)returntfromsympy.core.functionimportDerivativeiftype(arg)==Derivative:t=PyWeakTerm()t.fieldName=str(arg.args[0].func)# Python 3t.derDegree=1ifTuple==type(arg.args[1]):# sympy 1.2t.derCoordName=str(arg.args[1][0])else:# sympy 1.1.1t.derCoordName=str(arg.args[1])sn=[]foriinrange(0,len(arg.args[0].args)):sn.append(str(arg.args[0].args[i]))t.derCoordIndex_=sn.index(t.derCoordName)returntifisinstance(arg,Function):t=PyWeakTerm()# print(str(arg.func)+"* * * * * * ")# print(arg.func)# print (N)# print ([arg == nc for nc in N])ifnp.any([arg==ncforncin__cached_normal]):t.normal=Truet.derDegree=int(str(arg.func).split("_")[1])else:t.derDegree=0t.fieldName=str(arg.func)returntraiseException(f"Error!! arg of type ({type(arg)}) not supported: {arg}")