35#ifndef AIMS_MATH_GRADIENT_H
36#define AIMS_MATH_GRADIENT_H
39#include <cartodata/volume/volume.h>
267 virtual ~ AimsGradient() {}
456template <
class C>
inline
460 int beginx=0,endx=0,offx1=0,offx2=0;
462 std::vector<int> dims = data->
getSize();
463 std::vector<float> vs = data->getVoxelSize();
495 for (
int t=0;t<dims[3];t++)
496 for (
int z=0;z<dims[2];z++)
497 for (
int y=0;y<dims[1];y++)
498 for (
int x=beginx;x<endx;x++)
499 grad(x,y,z,t) = (C)( ((
float)data->at(x+offx2,y,z,t) -
500 (
float)data->at(x-offx1,y,z,t)) / divx);
505template <
class C>
inline
509 int beginy=0,endy=0,offy1=0,offy2=0;
511 std::vector<int> dims = data->
getSize();
512 std::vector<float> vs = data->getVoxelSize();
521 offy1=1;offy2=1;divy=2 * vs[1];
break;
523 offy1=1;offy2=0;divy=vs[1];
break;
525 offy1=0;offy2=1;divy=vs[1];
break;
528 for (
int t=0;t<dims[3];t++)
529 for (
int z=0;z<dims[2];z++)
530 for (
int y=beginy;y<endy;y++)
531 for (
int x=0;x<dims[0];x++)
532 grad(x,y,z,t) = (C)(((
float)data->at(x,y+offy2,z,t) -
533 (
float)data->at(x,y-offy1,z,t)) / divy);
538template <
class C>
inline
542 int beginz=0,endz=0,offz1=0,offz2=0;
544 std::vector<int> dims = data->
getSize();
545 std::vector<float> vs = data->getVoxelSize();
554 offz1=1;offz2=1;divz=2 * vs[2];
break;
556 offz1=1;offz2=0;divz=vs[2];
break;
558 offz1=0;offz2=1;divz=vs[2];
break;
561 for (
int t=0;t<dims[3];t++)
562 for (
int z=beginz;z<endz;z++)
563 for (
int y=0;y<dims[1];y++)
564 for (
int x=0;x<dims[0];x++)
565 grad(x,y,z,t) = (C)(((
float)data->at(x,y,z+offz2,t) -
566 (
float)data->at(x,y,z-offz1,t)) / divz);
571template <
class C>
inline
575 int begint=0,endt=0,offt1=0,offt2=0;
577 std::vector<int> dims = data->
getSize();
578 std::vector<float> vs = data->getVoxelSize();
587 offt1=1;offt2=1;divt=2 * vs[3];
break;
589 offt1=1;offt2=0;divt=vs[3];
break;
591 offt1=0;offt2=1;divt=vs[3];
break;
594 for (
int t=begint;t<endt;t++)
595 for (
int z=0;z<dims[2];z++)
596 for (
int y=0;y<dims[1];y++)
597 for (
int x=0;x<dims[0];x++)
598 grad(x,y,z,t) = (C)(((
float)data->at(x,y,z,t+offt2) -
599 (
float)data->at(x,y,z,t-offt1)) / divt);
606template <
class C>
inline
611template <
class C>
inline
616template <
class C>
inline
621template <
class C>
inline
627template <
class C>
inline
632template <
class C>
inline
637template <
class C>
inline
642template <
class C>
inline
648template <
class C>
inline
653template <
class C>
inline
658template <
class C>
inline
663template <
class C>
inline
669template <
class C>
inline
674template <
class C>
inline
679template <
class C>
inline
684template <
class C>
inline
692template <
class C>
inline
694{
return(
X(
XX(data)));
697template <
class C>
inline
699{
return(
X(
XY(data)));
702template <
class C>
inline
704{
return(
X(
XZ(data)));
707template <
class C>
inline
709{
return(
X(
XT(data)));
713template <
class C>
inline
715{
return(
X(
YX(data)));
718template <
class C>
inline
720{
return(
X(
YY(data)));
723template <
class C>
inline
725{
return(
X(
YZ(data)));
728template <
class C>
inline
730{
return(
X(
YT(data)));
734template <
class C>
inline
736{
return(
X(
ZX(data)));
739template <
class C>
inline
741{
return(
X(
ZY(data)));
744template <
class C>
inline
746{
return(
X(
ZZ(data)));
749template <
class C>
inline
751{
return(
X(
ZT(data)));
755template <
class C>
inline
757{
return(
X(
TX(data)));
760template <
class C>
inline
762{
return(
X(
TY(data)));
765template <
class C>
inline
767{
return(
X(
TZ(data)));
770template <
class C>
inline
772{
return(
X(
TT(data)));
776template <
class C>
inline
778{
return(
Y(
XX(data)));
781template <
class C>
inline
783{
return(
Y(
XY(data)));
786template <
class C>
inline
788{
return(
Y(
XZ(data)));
791template <
class C>
inline
793{
return(
Y(
XT(data)));
797template <
class C>
inline
799{
return(
Y(
YX(data)));
802template <
class C>
inline
804{
return(
Y(
YY(data)));
807template <
class C>
inline
809{
return(
Y(
YZ(data)));
812template <
class C>
inline
814{
return(
Y(
YT(data)));
818template <
class C>
inline
820{
return(
Y(
ZX(data)));
823template <
class C>
inline
825{
return(
Y(
ZY(data)));
828template <
class C>
inline
830{
return(
Y(
ZZ(data)));
833template <
class C>
inline
835{
return(
Y(
ZT(data)));
839template <
class C>
inline
841{
return(
Y(
TX(data)));
844template <
class C>
inline
846{
return(
Y(
TY(data)));
849template <
class C>
inline
851{
return(
Y(
TZ(data)));
854template <
class C>
inline
856{
return(
Y(
TT(data)));
860template <
class C>
inline
862{
return(
Z(
XX(data)));
865template <
class C>
inline
867{
return(
Z(
XY(data)));
870template <
class C>
inline
872{
return(
Z(
XZ(data)));
875template <
class C>
inline
877{
return(
Z(
XT(data)));
881template <
class C>
inline
883{
return(
Z(
YX(data)));
886template <
class C>
inline
888{
return(
Z(
YY(data)));
891template <
class C>
inline
893{
return(
Z(
YZ(data)));
896template <
class C>
inline
898{
return(
Z(
YT(data)));
902template <
class C>
inline
904{
return(
Z(
ZX(data)));
907template <
class C>
inline
909{
return(
Z(
ZY(data)));
912template <
class C>
inline
914{
return(
Z(
ZZ(data)));
917template <
class C>
inline
919{
return(
Z(
ZT(data)));
923template <
class C>
inline
925{
return(
Z(
TX(data)));
928template <
class C>
inline
930{
return(
Z(
TY(data)));
933template <
class C>
inline
935{
return(
Z(
TZ(data)));
938template <
class C>
inline
940{
return(
Z(
TT(data)));
944template <
class C>
inline
946{
return(
T(
XX(data)));
949template <
class C>
inline
951{
return(
T(
XY(data)));
954template <
class C>
inline
956{
return(
T(
XZ(data)));
959template <
class C>
inline
961{
return(
T(
XT(data)));
965template <
class C>
inline
967{
return(
T(
YX(data)));
970template <
class C>
inline
972{
return(
T(
YY(data)));
975template <
class C>
inline
977{
return(
T(
YZ(data)));
980template <
class C>
inline
982{
return(
T(
YT(data)));
986template <
class C>
inline
988{
return(
T(
ZX(data)));
991template <
class C>
inline
993{
return(
T(
ZY(data)));
996template <
class C>
inline
998{
return(
T(
ZZ(data)));
1001template <
class C>
inline
1003{
return(
T(
ZT(data)));
1007template <
class C>
inline
1009{
return(
T(
TX(data)));
1012template <
class C>
inline
1014{
return(
T(
TY(data)));
1017template <
class C>
inline
1019{
return(
T(
TZ(data)));
1022template <
class C>
inline
1024{
return(
T(
TT(data)));
carto::VolumeRef< C > XYY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdy2 = XYY(data)
carto::VolumeRef< C > XXZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dx2dz = XXZ(data)
carto::VolumeRef< C > YZX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydzdx = YZX(data)
carto::VolumeRef< C > TYY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdy2 = TYY(data)
carto::VolumeRef< C > YZ(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dydz = YZ(data)
carto::VolumeRef< C > ZTZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdtdz = ZTZ(data)
carto::VolumeRef< C > T(const carto::rc_ptr< carto::Volume< C > > &data)
d(data)/dt = AimsGradientT(data)
carto::VolumeRef< C > XYX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdydx = XYX(data)
carto::VolumeRef< C > TXX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdx2 = TXX(data)
carto::VolumeRef< C > YZY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydzdy = YZY(data)
carto::VolumeRef< C > ZZX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dz2dx = ZZX(data)
carto::VolumeRef< C > ZTY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdtdy = ZTY(data)
carto::VolumeRef< C > YYX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dy2dx = YYX(data)
carto::VolumeRef< C > YTZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydtdz = YTZ(data)
carto::VolumeRef< C > TTT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dt3 = TTT(data)
carto::VolumeRef< C > TTX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dt2dx = TTX(data)
carto::VolumeRef< C > YZZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydz2 = YZZ(data)
carto::VolumeRef< C > ZTX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdtdx = ZTX(data)
carto::VolumeRef< C > ZYX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdydx = ZYX(data)
carto::VolumeRef< C > TY(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dtdy = TY(data)
carto::VolumeRef< C > TZT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdzdt = TZT(data)
AimsGradient(int type=AIMS_GRADIENT_CENTRAL)
One argument can be give to the constructor :
carto::VolumeRef< C > ZXX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdx2 = ZXX(data)
carto::VolumeRef< C > YT(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dydt = YT(data)
carto::VolumeRef< C > YTX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydtdx = YTX(data)
carto::VolumeRef< C > TYT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdydt = TYT(data)
carto::VolumeRef< C > TYZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdydz = TYZ(data)
carto::VolumeRef< C > TT(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dt2 = TT(data)
carto::VolumeRef< C > TTZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dt2dz = TTZ(data)
carto::VolumeRef< C > XYZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdydz = XYZ(data)
carto::VolumeRef< C > ZXZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdxdz = ZXZ(data)
carto::VolumeRef< C > XTZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdtdz = XTZ(data)
int _type
Type of the gradient.
carto::VolumeRef< C > XZY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdzdy = XZY(data)
carto::VolumeRef< C > YTT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydt2 = YTT(data)
carto::VolumeRef< C > TXY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdxdy = TXY(data)
carto::VolumeRef< C > TX(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dtdx = TX(data)
carto::VolumeRef< C > XXT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dx2dt = XXT(data)
carto::VolumeRef< C > ZXT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdxdt = ZXT(data)
carto::VolumeRef< C > ZYZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdydz = ZYZ(data)
carto::VolumeRef< C > XZT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdzdt = XZT(data)
carto::VolumeRef< C > YXT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydxdt = YXT(data)
carto::VolumeRef< C > Z(const carto::rc_ptr< carto::Volume< C > > &data)
d(data)/dz = AimsGradientZ(data)
carto::VolumeRef< C > YYY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dy3 = YYY(data)
carto::VolumeRef< C > TTY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dt2dy = TTY(data)
carto::VolumeRef< C > YZT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydzdt = YZT(data)
carto::VolumeRef< C > X(const carto::rc_ptr< carto::Volume< C > > &data)
d(data)/dx = AimsGradientX(data)
carto::VolumeRef< C > ZX(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dzdx = ZX(data)
carto::VolumeRef< C > XZX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdzdx = XZX(data)
carto::VolumeRef< C > YXX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydx2 = YXX(data)
carto::VolumeRef< C > YYT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dy2dt = YYT(data)
carto::VolumeRef< C > ZXY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdxdy = ZXY(data)
carto::VolumeRef< C > TXZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdxdz = TXZ(data)
carto::VolumeRef< C > XY(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dxdy = XY(data)
carto::VolumeRef< C > YXZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydxdz = YXZ(data)
carto::VolumeRef< C > TZY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdzdy = TZY(data)
carto::VolumeRef< C > ZZZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dz3 = ZZZ(data)
carto::VolumeRef< C > XTY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdtdy = XTY(data)
carto::VolumeRef< C > YYZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dy2dz = YYZ(data)
carto::VolumeRef< C > ZT(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dzdt = ZT(data)
carto::VolumeRef< C > ZZT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dz2dt = ZZT(data)
carto::VolumeRef< C > TZZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdz2 = TZZ(data)
carto::VolumeRef< C > Y(const carto::rc_ptr< carto::Volume< C > > &data)
d(data)/dy = AimsGradientY(data)
carto::VolumeRef< C > YX(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dydx = YX(data)
carto::VolumeRef< C > XXY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dx2dy = XXY(data)
carto::VolumeRef< C > YTY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydtdy = YTY(data)
carto::VolumeRef< C > YXY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dydxdy = YXY(data)
carto::VolumeRef< C > TXT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdxdt = TXT(data)
carto::VolumeRef< C > YY(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dy2 = YY(data)
carto::VolumeRef< C > XYT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdydt = XYT(data)
carto::VolumeRef< C > ZYT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdydt = ZYT(data)
carto::VolumeRef< C > ZZY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dz2dy = ZZY(data)
carto::VolumeRef< C > TYX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdydx = TYX(data)
carto::VolumeRef< C > XX(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dx2 = XX(data)
carto::VolumeRef< C > XT(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dxdt = XT(data)
carto::VolumeRef< C > ZZ(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dz2 = ZZ(data)
carto::VolumeRef< C > ZY(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dzdy = ZY(data)
carto::VolumeRef< C > TZX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dtdzdx = TZX(data)
carto::VolumeRef< C > TZ(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dtdz = TZ(data)
carto::VolumeRef< C > XXX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dx3 = XXX(data)
carto::VolumeRef< C > ZYY(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdy2 = ZYY(data)
carto::VolumeRef< C > XTX(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdtdx = XTX(data)
carto::VolumeRef< C > XZZ(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdz2 = XZZ(data)
carto::VolumeRef< C > XTT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dxdt2 = XTT(data)
carto::VolumeRef< C > ZTT(const carto::rc_ptr< carto::Volume< C > > &data)
d3(data)/dzdt2 = ZTT(data)
carto::VolumeRef< C > XZ(const carto::rc_ptr< carto::Volume< C > > &data)
d2(data)/dxdz = XZ(data)
void fillBorder(const T &value)
virtual void copyHeaderFrom(const PropertySet &other)
std::vector< int > getSize() const
AimsGradientMethod
Gradient methods.
AimsFirstOrderGradient
First order.
AimsThirdOrderGradient
Third order.
AimsSecondOrderGradient
Second order.