periodize.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. template <class Real> const sctl::Vector<Real>& Periodize<Real>::GetProxySurf() {
  2. static const sctl::Vector<Real> proxy_surf = [](){
  3. sctl::Vector<Real> X;
  4. X.template Read<PrecompReal>("data/dn_equiv_surf.mat");
  5. return X;
  6. }();
  7. return proxy_surf;
  8. }
  9. template <class Real> void Periodize<Real>::EvalFarField(sctl::Vector<Real>& U_far, const sctl::Vector<Real>& Xt, const sctl::Vector<Real>& U_proxy) {
  10. const auto& Mbc0 = GetMat_UC2DE0();
  11. const auto& Mbc1 = GetMat_UC2DE1();
  12. const sctl::Long N = Mbc0.Dim(0);
  13. SCTL_ASSERT(U_proxy.Dim() == N);
  14. // Compute the equivalent density at proxy points
  15. auto proxy_density = (sctl::Matrix<Real>(1,N,(sctl::Iterator<Real>)U_proxy.begin(),false) * Mbc0) * Mbc1;
  16. // Evaluate the potential from proxy points at the targets Xt
  17. U_far = 0;
  18. static const sctl::Stokes3D_FxU stokeslet;
  19. stokeslet.template Eval<Real,true>(U_far, Xt, GetProxySurf(), sctl::Vector<Real>(), sctl::Vector<Real>(N,proxy_density.begin(),false));
  20. }
  21. template <class Real> const sctl::Matrix<Real>& Periodize<Real>::GetMat_UC2DE0() {
  22. static sctl::Matrix<Real> Mbc = [](){
  23. sctl::Matrix<Real> Mbc_ue2dc, M_dc2de0, M_uc2ue0, M_uc2ue1;
  24. M_uc2ue0.template Read<PrecompReal>("data/M_uc2ue0.mat");
  25. M_uc2ue1.template Read<PrecompReal>("data/M_uc2ue1.mat");
  26. Mbc_ue2dc.template Read<PrecompReal>("data/Mbc_ue2dc.mat");
  27. M_dc2de0.template Read<PrecompReal>("data/M_dc2de0.mat");
  28. return (M_uc2ue0 * (M_uc2ue1 * Mbc_ue2dc)) * M_dc2de0;
  29. }();
  30. return Mbc;
  31. }
  32. template <class Real> const sctl::Matrix<Real>& Periodize<Real>::GetMat_UC2DE1() {
  33. static sctl::Matrix<Real> Mbc = [](){
  34. sctl::Matrix<Real> M_dc2de1;
  35. M_dc2de1.template Read<PrecompReal>("data/M_dc2de1.mat");
  36. return M_dc2de1;
  37. }();
  38. return Mbc;
  39. }