]> https://gitweb.dealii.org/ - dealii.git/commitdiff
second derivatives of cosine function
authorGuido Kanschat <dr.guido.kanschat@gmail.com>
Mon, 5 Mar 2001 17:49:45 +0000 (17:49 +0000)
committerGuido Kanschat <dr.guido.kanschat@gmail.com>
Mon, 5 Mar 2001 17:49:45 +0000 (17:49 +0000)
git-svn-id: https://svn.dealii.org/trunk@4108 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/base/include/base/function_lib.h
deal.II/base/source/function_lib.cc

index c7aab5d4eb6303a6cc077da859c63c797c46f1d6..6d5b489bfe465e6785a4eabeea8ad63d736eca7e 100644 (file)
@@ -242,6 +242,19 @@ class CosineFunction : public Function<dim>
     virtual void laplacian_list (const typename std::vector<Point<dim> > &points,
                                 std::vector<double>            &values,
                                 const unsigned int              component = 0) const;
+
+                                    /**
+                                     * Gradient at a single point.
+                                     */
+    virtual Tensor<2,dim> hessian (const Point<dim>   &p,
+                                  const unsigned int  component = 0) const;
+
+                                    /**
+                                     * Gradients at multiple points.
+                                     */
+    virtual void hessian_list (const typename std::vector<Point<dim> > &points,
+                              typename std::vector<Tensor<2,dim> >    &hessians,
+                              const unsigned int              component = 0) const;
 };
 
 
index afe6e5ca2d48a5e3b9b8a408ef97df87190cfdda..a9d4a1ee72117f4e1d40c14e6f8ad0f7d26f490b 100644 (file)
@@ -12,6 +12,7 @@
 //----------------------------  function_lib.cc  ---------------------------
 
 
+#include <base/tensor.h>
 #include <base/point.h>
 #include <base/function_lib.h>
 
@@ -519,6 +520,110 @@ CosineFunction<dim>::gradient_list (const typename std::vector<Point<dim> > &poi
     }
 }
 
+template<int dim>
+Tensor<2,dim>
+CosineFunction<dim>::hessian (const Point<dim>   &p,
+                              const unsigned int) const
+{
+  const double pi2 = M_PI_2*M_PI_2;
+
+  Tensor<2,dim> result;
+  switch(dim)
+    {
+      case 1:
+           result[0][0] = -pi2* cos(M_PI_2*p(0));
+           break;
+      case 2:
+       if (true)
+         {
+           const double coco = -pi2*cos(M_PI_2*p(0)) * cos(M_PI_2*p(1));
+           const double sisi = pi2*sin(M_PI_2*p(0)) * sin(M_PI_2*p(1));
+           result[0][0] = coco;
+           result[1][1] = coco;
+           result[0][1] = sisi;
+           result[1][0] = sisi;
+         }
+       break;
+      case 3:
+       if (true)
+         {
+           const double cococo = -pi2*cos(M_PI_2*p(0)) * cos(M_PI_2*p(1)) * cos(M_PI_2*p(2));
+           const double sisico = pi2*sin(M_PI_2*p(0)) * sin(M_PI_2*p(1)) * cos(M_PI_2*p(2));
+           const double sicosi = pi2*sin(M_PI_2*p(0)) * cos(M_PI_2*p(1)) * sin(M_PI_2*p(2));
+           const double cosisi = pi2*cos(M_PI_2*p(0)) * sin(M_PI_2*p(1)) * sin(M_PI_2*p(2));
+
+           result[0][0] = cococo;
+           result[1][1] = cococo;
+           result[2][2] = cococo;
+           result[0][1] = sisico;
+           result[1][0] = sisico;
+           result[0][2] = sicosi;
+           result[2][0] = sicosi;
+           result[1][2] = cosisi;
+           result[2][1] = cosisi;
+         }
+       break;
+      default:
+           Assert(false, ExcNotImplemented());
+    }
+  return result;
+}
+
+template<int dim>
+void
+CosineFunction<dim>::hessian_list (const typename std::vector<Point<dim> > &points,
+                                   typename std::vector<Tensor<2,dim> >    &hessians,
+                                   const unsigned int) const
+{
+  Assert (hessians.size() == points.size(),
+         ExcDimensionMismatch(hessians.size(), points.size()));
+
+  const double pi2 = M_PI_2*M_PI_2;
+
+  for (unsigned int i=0;i<points.size();++i)
+    {
+      const Point<dim>& p = points[i];
+      switch(dim)
+       {
+         case 1:
+               hessians[i][0][0] = -pi2* cos(M_PI_2*p(0));
+               break;
+         case 2:
+           if (true)
+             {
+               const double coco = -pi2*cos(M_PI_2*p(0)) * cos(M_PI_2*p(1));
+               const double sisi = pi2*sin(M_PI_2*p(0)) * sin(M_PI_2*p(1));
+               hessians[i][0][0] = coco;
+               hessians[i][1][1] = coco;
+               hessians[i][0][1] = sisi;
+               hessians[i][1][0] = sisi;
+             }
+           break;
+         case 3:
+           if (true)
+             {
+               const double cococo = -pi2*cos(M_PI_2*p(0)) * cos(M_PI_2*p(1)) * cos(M_PI_2*p(2));
+               const double sisico = pi2*sin(M_PI_2*p(0)) * sin(M_PI_2*p(1)) * cos(M_PI_2*p(2));
+               const double sicosi = pi2*sin(M_PI_2*p(0)) * cos(M_PI_2*p(1)) * sin(M_PI_2*p(2));
+               const double cosisi = pi2*cos(M_PI_2*p(0)) * sin(M_PI_2*p(1)) * sin(M_PI_2*p(2));
+
+               hessians[i][0][0] = cococo;
+               hessians[i][1][1] = cococo;
+               hessians[i][2][2] = cococo;
+               hessians[i][0][1] = sisico;
+               hessians[i][1][0] = sisico;
+               hessians[i][0][2] = sicosi;
+               hessians[i][2][0] = sicosi;
+               hessians[i][1][2] = cosisi;
+               hessians[i][2][1] = cosisi;
+             }
+           break;
+         default:
+           Assert(false, ExcNotImplemented());
+       }
+    }
+}
+
 //////////////////////////////////////////////////////////////////////
 
 template<int dim>

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.