getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] [getfem-commits] branch master updated: Implement bspli


From: Konstantinos Poulios
Subject: [Getfem-commits] [getfem-commits] branch master updated: Implement bspline basis functions for mesh_fem in 2D
Date: Sun, 18 Dec 2022 19:02:47 -0500

This is an automated email from the git hooks/post-receive script.

logari81 pushed a commit to branch master
in repository getfem.

The following commit(s) were added to refs/heads/master by this push:
     new e7f75a1f Implement bspline basis functions for mesh_fem in 2D
e7f75a1f is described below

commit e7f75a1f61aae4dbad4a1104bea142c3866535df
Author: Konstantinos Poulios <logari81@gmail.com>
AuthorDate: Mon Dec 19 01:02:37 2022 +0100

    Implement bspline basis functions for mesh_fem in 2D
---
 src/getfem/getfem_global_function.h          |   5 +
 src/getfem/getfem_mesh_fem_global_function.h |  11 +
 src/getfem_global_function.cc                | 556 ++++++++++++++++++++++++++-
 src/getfem_mesh_fem_global_function.cc       |  61 ++-
 4 files changed, 629 insertions(+), 4 deletions(-)

diff --git a/src/getfem/getfem_global_function.h 
b/src/getfem/getfem_global_function.h
index 45ddd562..75fe122a 100644
--- a/src/getfem/getfem_global_function.h
+++ b/src/getfem/getfem_global_function.h
@@ -320,6 +320,11 @@ namespace getfem {
   global_function_on_level_sets(const std::vector<level_set> &lsets,
                                 const pxy_function &fn);
 
+  pglobal_function
+  global_function_bspline(scalar_type &xmin, scalar_type &xmax,
+                          scalar_type &ymin, scalar_type &ymax,
+                          size_type &order,
+                          size_type &xtype, size_type &ytype);
 
 }  /* end of namespace getfem.                                            */
 
diff --git a/src/getfem/getfem_mesh_fem_global_function.h 
b/src/getfem/getfem_mesh_fem_global_function.h
index e4686c77..65982de4 100644
--- a/src/getfem/getfem_mesh_fem_global_function.h
+++ b/src/getfem/getfem_mesh_fem_global_function.h
@@ -62,6 +62,17 @@ namespace getfem {
     virtual ~mesh_fem_global_function() { clear(); }
   };
 
+  /** This function will generate bspline basis functions in an NX x NY
+      rectilinear grid. The generated basis spans the entire bounding
+      box of the mesh linked by mf. The function will finally set the
+      generated bspline basis functions as the basis of mf.
+      In case mim is provided, this integration method will be used to
+      determine the support of he basis functions.
+  */
+  void define_bspline_basis_functions_for_mesh_fem
+  (mesh_fem_global_function &mf,
+   size_type NX, size_type NY, size_type order,
+   const mesh_im &mim=dummy_mesh_im());
 
 }  /* end of namespace getfem.                                            */
 
diff --git a/src/getfem_global_function.cc b/src/getfem_global_function.cc
index d552e188..e96503c6 100644
--- a/src/getfem_global_function.cc
+++ b/src/getfem_global_function.cc
@@ -1,7 +1,7 @@
 /*===========================================================================
 
- Copyright (C) 2004-2020 Yves Renard
- Copyright (C) 2016-2020 Konstantinos Poulios
+ Copyright (C) 2004-2022 Yves Renard
+ Copyright (C) 2016-2022 Konstantinos Poulios
 
  This file is a part of GetFEM
 
@@ -831,6 +831,558 @@ namespace getfem {
     return std::make_shared<global_function_on_levelsets_2D_>(ls, fn);
   }
 
+
+
+
+  // Global function for bspline basis
+  const scalar_type eps(1e-12);
+
+  // order k = 3
+  scalar_type bsp3_01(scalar_type t) {
+    return (t >= -eps && t < 1) ? pow(1.-t,2)
+                                : 0;
+  }
+  scalar_type bsp3_01_der(scalar_type t) {
+    return (t >= -eps && t < 1) ? 2.*t-2.
+                                : 0;
+  }
+  scalar_type bsp3_01_der2(scalar_type t) {
+    return (t >= eps && t <= 1.-eps) ? 2.
+                                     : 0;
+  }
+  scalar_type bsp3_01_der2_with_hint(scalar_type t, scalar_type t_hint) {
+    return (t > -eps && t < 1.+eps && t_hint > 0 && t_hint < 1) ? 2.
+                                                                : 0;
+  }
+  scalar_type bsp3_02(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1)
+        return (-1.5*t+2.)*t;
+      else if (t < 2)
+        return 0.5*pow(2.-t,2);
+    }
+    return 0;
+  }
+  scalar_type bsp3_02_der(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1)
+        return -3.*t+2.;
+      else if (t < 2)
+        return t-2.;
+    }
+    return 0;
+  }
+  scalar_type bsp3_02_der2(scalar_type t) {
+    if (t >= eps) {
+      if (t < 1.-eps)
+        return -3.;
+      else if (t < 1.+eps)
+        return 0;
+      else if (t <= 2.-eps)
+        return 1.;
+    }
+    return 0;
+  }
+  scalar_type bsp3_03(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return 0.5*t*t;
+      } else if (t < 2) {
+        t -= 1.;
+        return t*(1-t)+0.5;
+      } else if (t < 3) {
+        t = 3.-t;
+        return 0.5*t*t;
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp3_03_der(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return t;
+      } else if (t < 2) {
+        t -= 1.;
+        return 1.-2.*t;
+      } else if (t < 3) {
+        return t-3.;
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp3_03_der2(scalar_type t) {
+    if (t >= -eps) {
+      if (t < eps)
+        return 0;
+      else if (t <= 1.-eps)
+        return 1.;
+      else if (t < 1.+eps)
+        return 0;
+      else if (t <= 2.-eps)
+        return -2.;
+      else if (t < 2.+eps)
+        return 0;
+      else if (t <= 3.-eps)
+        return 1.;
+      else if (t < 3.+eps)
+        return 0;
+    }
+    return 0;
+  }
+
+  // order k = 4
+  scalar_type bsp4_01(scalar_type t) {
+    return (t >= -eps && t < 1) ? pow(1.-t,3)
+                                : 0;
+  }
+  scalar_type bsp4_01_der(scalar_type t) {
+    return (t >= -eps && t < 1) ? -3*pow(1.-t,2)
+                                : 0;
+  }
+  scalar_type bsp4_01_der2(scalar_type t) {
+    return (t >= -eps && t < 1) ? 6*(1.-t)
+                                : 0;
+  }
+  scalar_type bsp4_02(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return ((7./4.*t-9./2.)*t+3.)*t;
+      } else if (t < 2) {
+        return 1./4.*pow(2.-t,3);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp4_02_der(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return (21./4.*t-9.)*t+3.;
+      } else if (t < 2) {
+        return -3./4.*pow(2.-t,2);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp4_02_der2(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return 21./2.*t-9.;
+      } else if (t < 2) {
+        return 3./2.*(2.-t);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp4_03(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return (-11./12.*t+3./2.)*t*t;
+      } else if (t < 2) {
+        t -= 1;
+        return ((7./12.*t-5./4.)*t+1./4.)*t+7./12.;
+      } else if (t < 3) {
+        return 1./6.*pow(3.-t,3);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp4_03_der(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return (-11./4.*t+3.)*t;
+      } else if (t < 2) {
+        t -= 1;
+        return (7./4.*t-5./2.)*t+1./4.;
+      } else if (t < 3) {
+        return -1./2.*pow(3.-t,2);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp4_03_der2(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return -11./2.*t+3.;
+      } else if (t < 2) {
+        t -= 1;
+        return 7./2.*t-5./2.;
+      } else if (t < 3) {
+        return 3.-t;
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp4_04(scalar_type t) {
+    if (t > 2) {
+      t = 4.-t;
+    }
+    if (t >= -eps) {
+      if (t < 1) {
+        return 1./6.*pow(t,3);
+      } else if (t <= 2) {
+        t = t-1.;
+        return ((-1./2.*t+1./2.)*t+1./2.)*t+1./6.;
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp4_04_der(scalar_type t) {
+    scalar_type sgn(1);
+    if (t > 2) {
+      t = 4.-t;
+      sgn = -1.;
+    }
+    if (t >= -eps) {
+      if (t < 1) {
+        return 1./2.*pow(t,2)*sgn;
+      } else if (t < 2) {
+        t = t-1.;
+        return ((-3./2.*t+1.)*t+1./2.)*sgn;
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp4_04_der2(scalar_type t) {
+    if (t > 2) {
+      t = 4.-t;
+    }
+    if (t >= -eps) {
+      if (t < 1) {
+        return t;
+      } else if (t < 2) {
+        t = t-1.;
+        return -3.*t+1.;
+      }
+    }
+    return 0;
+  }
+
+
+  // order k = 5
+  scalar_type bsp5_01(scalar_type t) {
+    return (t >= -eps && t < 1) ? pow(1.-t,4)
+                                : 0;
+  }
+  scalar_type bsp5_01_der(scalar_type t) {
+    return (t >= -eps && t < 1) ? -4.*pow(1.-t,3)
+                                : 0;
+  }
+  scalar_type bsp5_01_der2(scalar_type t) {
+    return (t >= -eps && t < 1) ? 12.*pow(1.-t,2)
+                                : 0;
+  }
+  scalar_type bsp5_02(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return (((-15./8.*t+7.)*t-9.)*t+4.)*t;
+      } else if (t < 2) {
+        return 1./8.*pow(2.-t,4);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_02_der(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return ((-15./2.*t+21.)*t-18.)*t+4.;
+      } else if (t < 2) {
+        return -1./2.*pow(2.-t,3);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_02_der2(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return (-45./2.*t+42.)*t-18.;
+      } else if (t < 2) {
+        return 3./2.*pow(2.-t,2);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_03(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return ((85./72.*t-11./3.)*t+3.)*t*t;
+      } else if (t < 2) {
+        t = 2.-t;
+        return (((-23./72*t+2./9.)*t+1./3.)*t+2./9.)*t+1./18.;
+      } else if (t < 3) {
+        return 1./18.*pow(3.-t,4);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_03_der(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return ((85./18.*t-11.)*t+6.)*t;
+      } else if (t < 2) {
+        t = 2.-t;
+        return -(((-23./18*t+2./3.)*t+2./3.)*t+2./9.);
+      } else if (t < 3) {
+        return -2./9.*pow(3.-t,3);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_03_der2(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return (85./6.*t-22.)*t+6.;
+      } else if (t < 2) {
+        t = 2.-t;
+        return (-23./6*t+4./3.)*t+2./3.;
+      } else if (t < 3) {
+        return 2./3.*pow(3.-t,2);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_04(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return (-25./72.*t+2./3.)*t*t*t;
+      } else if (t < 2) {
+        t = 2.-t;
+        return (((23./72.*t-5./9.)*t-1./3.)*t+4./9.)*t+4./9.;
+      } else if (t < 3) {
+        t = t-2.;
+        return (((-13./72.*t+5./9.)*t-1./3.)*t-4./9.)*t+4./9.;
+      } else if (t < 4) {
+        return 1./24.*pow(4.-t,4);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_04_der(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return (-25./18.*t+2.)*t*t;
+      } else if (t < 2) {
+        t = 2.-t;
+        return -(((23./18.*t-5./3.)*t-2./3.)*t+4./9.);
+      } else if (t < 3) {
+        t = t-2.;
+        return ((-13./18.*t+5./3.)*t-2./3.)*t-4./9.;
+      } else if (t < 4) {
+        return -1./6.*pow(4.-t,3);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_04_der2(scalar_type t) {
+    if (t >= -eps) {
+      if (t < 1) {
+        return (-25./6.*t+4.)*t;
+      } else if (t < 2) {
+        t = 2.-t;
+        return (23./6.*t-10./3.)*t-2./3.;
+      } else if (t < 3) {
+        t = t-2.;
+        return -((-13./6.*t+10./3.)*t-2./3.);
+      } else if (t < 4) {
+        return 1./2.*pow(4.-t,2);
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_05(scalar_type t) {
+    if (t > scalar_type(2.5)) {
+      t = 5.-t;
+    }
+    if (t >= -eps) {
+      if (t < 1) {
+        return 1./24.*pow(t,4);
+      } else if (t < 2) {
+        t = t-1.;
+        return (((-1./6.*t+1./6.)*t+1./4.)*t+1./6.)*t+1./24.;
+      } else if (t < 3) {
+        t = pow(t-2.5,2);
+        return (1./4.*t-5./8.)*t+115./192.;
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_05_der(scalar_type t) {
+    scalar_type sgn(1);
+    if (t > scalar_type(2.5)) {
+      t = 5.-t;
+      sgn = -1.;
+    }
+    if (t >= -eps) {
+      if (t < 1) {
+        return 1./6.*pow(t,3)*sgn;
+      } else if (t < 2) {
+        t = t-1.;
+        return (((-2./3.*t+1./2.)*t+1./2)*t+1./6.)*sgn;
+      } else if (t < 3) {
+        t = t-2.5;
+        return (t*t-5./4.)*t*sgn;
+      }
+    }
+    return 0;
+  }
+  scalar_type bsp5_05_der2(scalar_type t) {
+    if (t > scalar_type(2.5)) {
+      t = 5.-t;
+    }
+    if (t >= -eps) {
+      if (t < 1) {
+        return 1./2.*pow(t,2);
+      } else if (t < 2) {
+        t = t-1.;
+        return (-2.*t+1.)*t+1./2;
+      } else if (t < 3) {
+        t = t-2.5;
+        return 3*t*t-5./4.;
+      }
+    }
+    return 0;
+  }
+
+
+
+  class global_function_xy_bspline_
+    : public global_function_simple, public context_dependencies {
+    scalar_type xmin, ymin, xmax, ymax, xscale, yscale;
+    std::function<scalar_type(scalar_type)>
+      fx, fy, fx_der, fy_der, fx_der2, fy_der2;
+  public:
+    void update_from_context() const {}
+
+    virtual scalar_type val(const base_node &pt) const
+    {
+      return fx(xscale*(pt[0]-xmin))
+             * fy(yscale*(pt[1]-ymin));
+    }
+    virtual void grad(const base_node &pt, base_small_vector &g) const
+    {
+      scalar_type dx = xscale*(pt[0]-xmin),
+                  dy = yscale*(pt[1]-ymin);
+      g.resize(dim_);
+      g[0] = xscale * fx_der(dx) * fy(dy);
+      g[1] = fx(dx) * yscale * fy_der(dy);
+    }
+    virtual void hess(const base_node &pt, base_matrix &h) const
+    {
+      scalar_type dx = xscale*(pt[0]-xmin),
+                  dy = yscale*(pt[1]-ymin);
+      h.resize(dim_, dim_);
+      gmm::clear(h);
+      h(0,0) = xscale*xscale * fx_der2(dx) * fy(dy);
+      h(0,1) = h(1,0) = xscale * fx_der(dx) * yscale * fy_der(dy);
+      h(1,1) = fx(dx) * yscale*yscale * fy_der2(dy);
+    }
+
+    virtual bool is_in_support(const base_node &pt) const {
+      scalar_type dx = pt[0]-(xmin+xmax)/2,
+                  dy = pt[1]-(ymin+ymax)/2;
+      return (gmm::abs(dx)+1e-9 < gmm::abs(xmax-xmin)/2) &&
+             (gmm::abs(dy)+1e-9 < gmm::abs(ymax-ymin)/2);
+    }
+
+    virtual void bounding_box(base_node &bmin, base_node &bmax) const {
+      GMM_ASSERT1(bmin.size() == dim_ && bmax.size() == dim_,
+                  "Wrong dimensions");
+      bmin[0] = std::min(xmin,xmax);
+      bmin[1] = std::min(ymin,ymax);
+      bmax[0] = std::max(xmin,xmax);
+      bmax[1] = std::max(ymin,ymax);
+    }
+
+    global_function_xy_bspline_(const scalar_type &xmin_, const scalar_type 
&xmax_,
+                                const scalar_type &ymin_, const scalar_type 
&ymax_,
+                                const size_type &order, 
+                                const size_type &xtype, const size_type &ytype)
+    : global_function_simple(2), xmin(xmin_), ymin(ymin_), xmax(xmax_), 
ymax(ymax_),
+      xscale(scalar_type(xtype)/(xmax-xmin)), 
yscale(scalar_type(ytype)/(ymax-ymin))
+    {
+      GMM_ASSERT1(order >= 3 && order <= 5, "Wrong input");
+      GMM_ASSERT1(xtype >= 1 && xtype <= order &&
+                  ytype >= 1 && ytype <= order, "Wrong input");
+      if (order == 3) {
+        if (xtype == 1) {
+          fx = bsp3_01;   fx_der = bsp3_01_der;   fx_der2 = bsp3_01_der2;
+        } else if (xtype == 2) {
+          fx = bsp3_02;   fx_der = bsp3_02_der;   fx_der2 = bsp3_02_der2;
+        } else if (xtype == 3) {
+          fx = bsp3_03;   fx_der = bsp3_03_der;   fx_der2 = bsp3_03_der2;
+        }
+
+        if (ytype == 1) {
+          fy = bsp3_01;   fy_der = bsp3_01_der;   fy_der2 = bsp3_01_der2;
+        } else if (ytype == 2) {
+          fy = bsp3_02;   fy_der = bsp3_02_der;   fy_der2 = bsp3_02_der2;
+        } else if (ytype == 3) {
+          fy = bsp3_03;   fy_der = bsp3_03_der;   fy_der2 = bsp3_03_der2;
+        }
+      } else if (order == 4) {
+        if (xtype == 1) {
+          fx = bsp4_01;   fx_der = bsp4_01_der;   fx_der2 = bsp4_01_der2;
+        } else if (xtype == 2) {
+          fx = bsp4_02;   fx_der = bsp4_02_der;   fx_der2 = bsp4_02_der2;
+        } else if (xtype == 3) {
+          fx = bsp4_03;   fx_der = bsp4_03_der;   fx_der2 = bsp4_03_der2;
+        } else if (xtype == 4) {
+          fx = bsp4_04;   fx_der = bsp4_04_der;   fx_der2 = bsp4_04_der2;
+        }
+
+        if (ytype == 1) {
+          fy = bsp4_01;   fy_der = bsp4_01_der;   fy_der2 = bsp4_01_der2;
+        } else if (ytype == 2) {
+          fy = bsp4_02;   fy_der = bsp4_02_der;   fy_der2 = bsp4_02_der2;
+        } else if (ytype == 3) {
+          fy = bsp4_03;   fy_der = bsp4_03_der;   fy_der2 = bsp4_03_der2;
+        } else if (ytype == 4) {
+          fy = bsp4_04;   fy_der = bsp4_04_der;   fy_der2 = bsp4_04_der2;
+        }
+
+      } else if (order == 5) {
+        if (xtype == 1) {
+          fx = bsp5_01;   fx_der = bsp5_01_der;   fx_der2 = bsp5_01_der2;
+        } else if (xtype == 2) {
+          fx = bsp5_02;   fx_der = bsp5_02_der;   fx_der2 = bsp5_02_der2;
+        } else if (xtype == 3) {
+          fx = bsp5_03;   fx_der = bsp5_03_der;   fx_der2 = bsp5_03_der2;
+        } else if (xtype == 4) {
+          fx = bsp5_04;   fx_der = bsp5_04_der;   fx_der2 = bsp5_04_der2;
+        } else if (xtype == 5) {
+          fx = bsp5_05;   fx_der = bsp5_05_der;   fx_der2 = bsp5_05_der2;
+        }
+
+        if (ytype == 1) {
+          fy = bsp5_01;   fy_der = bsp5_01_der;   fy_der2 = bsp5_01_der2;
+        } else if (ytype == 2) {
+          fy = bsp5_02;   fy_der = bsp5_02_der;   fy_der2 = bsp5_02_der2;
+        } else if (ytype == 3) {
+          fy = bsp5_03;   fy_der = bsp5_03_der;   fy_der2 = bsp5_03_der2;
+        } else if (ytype == 4) {
+          fy = bsp5_04;   fy_der = bsp5_04_der;   fy_der2 = bsp5_04_der2;
+        } else if (ytype == 5) {
+          fy = bsp5_05;   fy_der = bsp5_05_der;   fy_der2 = bsp5_05_der2;
+        }
+      }
+    }
+
+    virtual ~global_function_xy_bspline_()
+    { DAL_STORED_OBJECT_DEBUG_DESTROYED(this, "Global function xy bspline"); }
+  };
+
+
+  pglobal_function
+  global_function_bspline(scalar_type &xmin, scalar_type &xmax,
+                          scalar_type &ymin, scalar_type &ymax,
+                          size_type &order,
+                          size_type &xtype, size_type &ytype) {
+    return std::make_shared<global_function_xy_bspline_>
+                           (xmin, xmax, ymin, ymax, order, xtype, ytype);
+  }
+
+
+
+
   // interpolator on mesh_fem
 
   interpolator_on_mesh_fem::interpolator_on_mesh_fem
diff --git a/src/getfem_mesh_fem_global_function.cc 
b/src/getfem_mesh_fem_global_function.cc
index cffb4785..d595d0ae 100644
--- a/src/getfem_mesh_fem_global_function.cc
+++ b/src/getfem_mesh_fem_global_function.cc
@@ -1,7 +1,7 @@
 /*===========================================================================
 
- Copyright (C) 2004-2020 Yves Renard
- Copyright (C) 2016-2020 Konstantinos Poulios
+ Copyright (C) 2004-2022 Yves Renard
+ Copyright (C) 2016-2022 Konstantinos Poulios
 
  This file is a part of GetFEM
 
@@ -51,6 +51,63 @@ namespace getfem {
     }
   }
 
+
+  void define_bspline_basis_functions_for_mesh_fem
+  (mesh_fem_global_function &mf,
+   size_type NX, size_type NY, size_type order,
+   const mesh_im &mim) {
+
+    base_node Pmin, Pmax;
+    mf.linked_mesh().bounding_box(Pmin, Pmax);
+    scalar_type x0=Pmin[0], y0=Pmin[1], x1=Pmax[0], y1=Pmax[1];
+
+    scalar_type xmin, xmax, ymin, ymax;
+    size_type xtype, ytype;
+    base_node pt(2);
+
+    std::vector<pglobal_function> funcs((NX+order-1)*(NY+order-1));
+    for (size_type i=0; i < NX+order-1; ++i) {
+      if (i < order-1) {
+        xmin = x0;
+        xmax = x0+scalar_type(i+1)*(x1-x0)/scalar_type(NX);
+        xtype = i+1;
+        pt[0] = (i == 0) ? xmin : (xmin+(xmax-xmin)/3);
+      } else if (i >= NX) {
+        xmin = x1;
+        xmax = 
x1+(scalar_type(i-NX)-scalar_type(order-1))*(x1-x0)/scalar_type(NX);
+        xtype = NX-i+order-1;
+        pt[0] = (i == NX+1) ? xmin : (xmin+(xmax-xmin)/3);
+      } else {
+        xmin = x0+scalar_type(i-order+1)*(x1-x0)/scalar_type(NX);
+        xmax = x0+scalar_type(i+1)*(x1-x0)/scalar_type(NX);
+        xtype = order;
+        pt[0] = (xmin+xmax)/2;
+      }
+      for (size_type j=0; j < NY+order-1; ++j) {
+        if (j < order-1) {
+          ymin = y0;
+          ymax = y0+scalar_type(j+1)*(y1-y0)/scalar_type(NY);
+          ytype = j+1;
+          pt[1] = (j == 0) ? ymin : (ymin+(ymax-ymin)/3);
+        } else if (j >= NY) {
+          ymin = y1;
+          ymax = 
y1+(scalar_type(j-NY)-scalar_type(order-1))*(y1-y0)/scalar_type(NY);
+          ytype = NY-j+order-1;
+          pt[1] = (j == NY+1) ? ymin : (ymin+(ymax-ymin)/3);
+        } else {
+          ymin = y0+scalar_type(j-order+1)*(y1-y0)/scalar_type(NY);
+          ymax = y0+scalar_type(j+1)*(y1-y0)/scalar_type(NY);
+          ytype = order;
+          pt[1] = (ymin+ymax)/2;
+        }
+        funcs[i*(NY+order-1)+j] = global_function_bspline
+                                  (xmin, xmax, ymin, ymax, order, xtype, 
ytype);
+      }
+    }
+
+    mf.set_functions(funcs, mim);
+  }
+
 }
 
 /* end of namespace getfem  */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]