SchlierenCartridge.cpp (2388B)
1 // File : SchlierenCartridge.cpp 2 // Date : Fri 29 Apr 2016 11:30:07 AM CEST 3 // Author : Fabian Wermelinger 4 // Description: Schlieren shader implementation 5 // Copyright 2016 ETH Zurich. All Rights Reserved. 6 #include "SchlierenCartridge.h" 7 8 void SchlierenCartridge::_compute(Slice& data) 9 { 10 m_gradX.resize(data.width(), data.height()); 11 m_gradY.resize(data.width(), data.height()); 12 _gradX(data); 13 _gradY(data); 14 for (int h=0; h < data.height(); ++h) 15 for (int w=0; w < data.width(); ++w) 16 { 17 const Real IphiI2 = m_gradX(w,h)*m_gradX(w,h) + m_gradY(w,h)*m_gradY(w,h); 18 data(w,h) = sqrt(IphiI2); 19 } 20 } 21 22 // 4th-order Finite Differences 23 void SchlierenCartridge::_gradX(const Slice& data) 24 { 25 // this assumes 26 // 1.) uniform grid-spacing 27 // 2.) maximum extend = 1 28 const Real fac = data.get_max3Ddim()/12.0; 29 30 // left 31 for (int h=0; h < data.height(); ++h) 32 for (int w=0; w < 2; ++w) 33 m_gradX(w,h) = fac*(-25.0*data(w,h) + 48.0*data(w+1,h) - 36.0*data(w+2,h) + 16.0*data(w+3,h) - 3.0*data(w+4,h)); 34 35 // right 36 for (int h=0; h < data.height(); ++h) 37 for (int w=data.width()-2; w < data.width(); ++w) 38 m_gradX(w,h) = -fac*(-25.0*data(w,h) + 48.0*data(w-1,h) - 36.0*data(w-2,h) + 16.0*data(w-3,h) - 3.0*data(w-4,h)); 39 40 // interior 41 for (int h=0; h < data.height(); ++h) 42 for (int w=2; w < data.width()-2; ++w) 43 m_gradX(w,h) = fac*(-data(w+2,h) + 8.0*data(w+1,h) - 8.0*data(w-1,h) + data(w-2,h)); 44 } 45 46 void SchlierenCartridge::_gradY(const Slice& data) 47 { 48 // this assumes 49 // 1.) uniform grid-spacing 50 // 2.) maximum extend = 1 51 const Real fac = data.get_max3Ddim()/12.0; 52 53 // left 54 for (int h=0; h < 2; ++h) 55 for (int w=0; w < data.width(); ++w) 56 m_gradY(w,h) = fac*(-25.0*data(w,h) + 48.0*data(w,h+1) - 36.0*data(w,h+2) + 16.0*data(w,h+3) - 3.0*data(w,h+4)); 57 58 // right 59 for (int h=data.height()-2; h < data.height(); ++h) 60 for (int w=0; w < data.width(); ++w) 61 m_gradY(w,h) = -fac*(-25.0*data(w,h) + 48.0*data(w,h-1) - 36.0*data(w,h-2) + 16.0*data(w,h-3) - 3.0*data(w,h-4)); 62 63 // interior 64 for (int h=2; h < data.height()-2; ++h) 65 for (int w=0; w < data.width(); ++w) 66 m_gradY(w,h) = fac*(-data(w,h+2) + 8.0*data(w,h+1) - 8.0*data(w,h-1) + data(w,h-2)); 67 }