diff --git a/cxxfem/src/femPost.cpp b/cxxfem/src/femPost.cpp index 395335a5fdeca8a9f6ad1fb530f1b3c08dcb25e5..be8d5e18d5c4a14200dc000fb50baf83a72e9dbd 100644 --- a/cxxfem/src/femPost.cpp +++ b/cxxfem/src/femPost.cpp @@ -364,6 +364,19 @@ Post::probe(std::string const &name, std::string const &grpname) // get physical group from grpname Group *grp = solver.pbl.groups_by_name.at(grpname); // TODO: better handling of errors + std::vector<std::size_t> nodeTags; + std::vector<double> coord; + gmsh::model::mesh::getNodesForPhysicalGroup(grp->dim, grp->tag, nodeTags, coord); + // j'ai essayé de boucler sur les entités du groupe et faire un getNode de l'entité + // mais ça ne me retourne rien (?) + // std::cout << "nodeTags.size()=" << nodeTags.size() << '\n'; + + // retourne les coordonnées des noeuds du groupe si demandé + if(name=="coords") + { + return coord; + } + // get the view auto it = views.find(name); if (it == views.end()) @@ -373,14 +386,6 @@ Post::probe(std::string const &name, std::string const &grpname) // probe values std::vector<double> all_values; - std::vector<std::size_t> nodeTags; - std::vector<double> coord; - gmsh::model::mesh::getNodesForPhysicalGroup(grp->dim, grp->tag, nodeTags, coord); - // j'ai essayé de boucler sur les entités du groupe et faire un getNode de l'entité - // mais ça ne me retourne rien (?) - - // std::cout << "nodeTags.size()=" << nodeTags.size() << '\n'; - for (size_t i = 0; i < nodeTags.size(); ++i) { std::vector<double> values; diff --git a/models/bonemodel2.py b/models/bonemodel2.py index e7397baeabbee1ec005d47ccb884185eea7e387c..25ade80a5748e54b97da8a4ac9757c166d4da3b8 100644 --- a/models/bonemodel2.py +++ b/models/bonemodel2.py @@ -242,17 +242,35 @@ def solve(p={}): for var in extr['variables']: fname = f'{extr["name"]}_{var}.tsv' grpname = extr['name'] + v = [] + units = "" if var.lower() in var2field: + # extract values from gmsh views field = var2field[var.lower()][0] units = var2field[var.lower()][1] - v = np.array(post.probe(field, grpname)) - np.savetxt(fname, v, delimiter='\t', header='value') + v = np.array(post.probe(field, grpname)) + elif var.lower() in ['x0', 'y0', 'z0']: + # extract coordinates of the nodes + units = 'mm' + v = np.array(post.probe('coords', grpname)) + v = np.reshape(v, (v.size//3, 3)) + v = v[:, ['x0', 'y0', 'z0'].index(var.lower())] + elif var.lower() in ['fx', 'fy', 'fz']: + # extract forces + units = 'N' + v = np.array(post.probe('force_vector', grpname)) + v = np.reshape(v, (v.size//3, 3)) + v = v[:, ['fx', 'fy', 'fz'].index(var.lower())] + else: + print(f'unknown variable: "{var}"') + + if len(v) > 0: + np.savetxt(fname, v, delimiter='\t', header=var.lower()) if len(v) == 1: print(f'\t{grpname}_{var} = {v[0]:.3f} {units}') else: - print(f'\t{grpname}_{var} = ({len(v)} values in "{fname}")') - else: - print(f'unknown variable: "{var}"') + print(f'\t{grpname}_{var} = ({len(v)} values in "{fname}")') + end_time = time.perf_counter() elapsed_time = end_time - start_time diff --git a/models/dolicorhynchops/dolicorhynchops_10k.py b/models/dolicorhynchops/dolicorhynchops_10k.py index ac51fdfd395f609e750a49fbdee007cac103f447..4ef2f960f0853d48d63c62e0f2fd6f95def3fbbd 100644 --- a/models/dolicorhynchops/dolicorhynchops_10k.py +++ b/models/dolicorhynchops/dolicorhynchops_10k.py @@ -52,6 +52,11 @@ def parms(d={}): 'name': 'tooth2', 'nodes': [-11.92466, 26.3042, -229.5354], 'variables': [ 'sigxx', 'sigyy', 'sigzz', 'sigvm' ] + }, + { + 'name': 'Lmuscle', + 'nodes': f'{path}/Lmuscle.stl', + 'variables': [ 'x0', 'y0', 'z0', 'sigvm' ] } ]