00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 inline
00039 G4double G4Paraboloid::GetZHalfLength() const
00040 {
00041 return dz;
00042 }
00043
00044 inline
00045 G4double G4Paraboloid::GetRadiusPlusZ() const
00046 {
00047 return r2;
00048 }
00049
00050 inline
00051 G4double G4Paraboloid::GetRadiusMinusZ() const
00052 {
00053 return r1;
00054 }
00055
00056 inline
00057 void G4Paraboloid::SetZHalfLength(G4double pDz)
00058 {
00059 if(pDz <= 0)
00060 {
00061 G4Exception("G4Paraboloid::SetZHalfLength()", "GeomSolids0002",
00062 FatalException, "Invalid dimensions.");
00063 }
00064 else
00065 {
00066 dz = pDz;
00067 k1 = (sqr(r2) - sqr(r1)) / (2 * dz);
00068 k2 = (sqr(r2) + sqr(r1)) / 2;
00069
00070
00071
00072
00073 fSurfaceArea = 0.;
00074 fCubicVolume = 0.;
00075 }
00076 }
00077
00078 inline
00079 void G4Paraboloid::SetRadiusPlusZ(G4double pR2)
00080 {
00081 if(pR2 <= 0 || pR2 <= r1)
00082 {
00083 G4Exception("G4Paraboloid::SetRadiusPlusZ()", "GeomSolids0002",
00084 FatalException, "Invalid dimensions.");
00085 }
00086 else
00087 {
00088 r2 = pR2;
00089 k1 = (sqr(r2) - sqr(r1)) / (2 * dz);
00090 k2 = (sqr(r2) + sqr(r1)) / 2;
00091
00092
00093
00094
00095 fSurfaceArea = 0.;
00096 fCubicVolume = 0.;
00097 }
00098 }
00099
00100 inline
00101 void G4Paraboloid::SetRadiusMinusZ(G4double pR1)
00102 {
00103 if(pR1 < 0 || pR1 >= r2)
00104 {
00105 G4Exception("G4Paraboloid::SetRadiusMinusZ()", "GeomSolids0002",
00106 FatalException, "Invalid dimensions.");
00107 }
00108 else
00109 {
00110 r1 = pR1;
00111 k1 = (sqr(r2) - sqr(r1)) / (2 * dz);
00112 k2 = (sqr(r2) + sqr(r1)) / 2;
00113
00114
00115
00116
00117 fSurfaceArea = 0.;
00118 fCubicVolume = 0.;
00119 }
00120 }
00121
00122 inline
00123 G4double G4Paraboloid::GetCubicVolume()
00124 {
00125 if(fCubicVolume != 0 ) {;}
00126 else
00127 {
00128 fCubicVolume = CLHEP::twopi * k2 * dz;
00129 }
00130 return fCubicVolume;
00131 }
00132
00133
00134 inline
00135 G4double G4Paraboloid::CalculateSurfaceArea() const
00136 {
00137 G4double h1, h2, A1, A2;
00138
00139 h1 = k2/k1 + dz;
00140 h2 = k2/k1 - dz;
00141
00142
00143
00144
00145 A1 = sqr(r2) + 4 * sqr(h1);
00146 A1 *= sqr(A1);
00147 A1 = CLHEP::pi * r2 /6 / sqr(h1) * ( std::sqrt(A1) - r2 * r2 * r2);
00148
00149
00150
00151
00152 A2 = sqr(r1) + 4 * sqr(h2);
00153 A2 *= sqr(A2);
00154
00155 if(h2 != 0)
00156 { A2 = CLHEP::pi * r1 /6 / sqr(h2) * ( std::sqrt(A2) - r1 * r1 * r1); }
00157 else
00158 { A2 = 0.; }
00159
00160 return fSurfaceArea = A1 - A2 + (sqr(r1) + sqr(r2))*CLHEP::pi;
00161 }
00162
00163 inline
00164 G4double G4Paraboloid::GetSurfaceArea()
00165 {
00166 if(fSurfaceArea == 0.) CalculateSurfaceArea();
00167
00168 return fSurfaceArea;
00169 }