LCOV - code coverage report
Current view: top level - src/Field - FieldOperations.hpp (source / functions) Coverage Total Hit
Test: report.info Lines: 100.0 % 64 64
Test Date: 2025-05-21 11:16:25 Functions: 87.7 % 57 50
Branches: 48.9 % 90 44

             Branch data     Line data    Source code
       1                 :             : //
       2                 :             : // File FieldOperations
       3                 :             : //   Differential operators for fields
       4                 :             : //
       5                 :             : 
       6                 :             : namespace ippl {
       7                 :             :     /*!
       8                 :             :      * User interface of gradient
       9                 :             :      * @param u field
      10                 :             :      */
      11                 :             :     template <typename Field>
      12                 :          12 :     detail::meta_grad<Field> grad(Field& u) {
      13                 :          12 :         constexpr unsigned Dim = Field::dim;
      14                 :             : 
      15         [ +  - ]:          12 :         u.fillHalo();
      16                 :          12 :         BConds<Field, Dim>& bcField = u.getFieldBC();
      17         [ +  - ]:          12 :         bcField.apply(u);
      18                 :             : 
      19                 :             :         using mesh_type   = typename Field::Mesh_t;
      20                 :             :         using vector_type = typename mesh_type::vector_type;
      21                 :             : 
      22                 :          12 :         mesh_type& mesh = u.get_mesh();
      23 [ #  # ][ +  -  :         108 :         vector_type vectors[Dim];
          +  +  -  -  -  
                      - ]
      24         [ +  + ]:          54 :         for (unsigned d = 0; d < Dim; d++) {
      25                 :          42 :             vectors[d]    = 0;
      26         [ +  - ]:          42 :             vectors[d][d] = 0.5 / mesh.getMeshSpacing(d);
      27                 :             :         }
      28         [ +  - ]:          24 :         return detail::meta_grad<Field>(u, vectors);
      29   [ +  +  -  - ]:          54 :     }
      30                 :             : 
      31                 :             :     /*!
      32                 :             :      * User interface of divergence in three dimensions.
      33                 :             :      * @param u field
      34                 :             :      */
      35                 :             :     template <typename Field>
      36                 :          12 :     detail::meta_div<Field> div(Field& u) {
      37                 :          12 :         constexpr unsigned Dim = Field::dim;
      38                 :             : 
      39         [ +  - ]:          12 :         u.fillHalo();
      40                 :          12 :         BConds<Field, Dim>& bcField = u.getFieldBC();
      41         [ +  - ]:          12 :         bcField.apply(u);
      42                 :             : 
      43                 :             :         using mesh_type   = typename Field::Mesh_t;
      44                 :             :         using vector_type = typename mesh_type::vector_type;
      45                 :             : 
      46                 :          12 :         mesh_type& mesh = u.get_mesh();
      47   [ +  -  +  +  :         108 :         vector_type vectors[Dim];
             -  -  -  - ]
      48         [ +  + ]:          54 :         for (unsigned d = 0; d < Dim; d++) {
      49                 :          42 :             vectors[d]    = 0;
      50         [ +  - ]:          42 :             vectors[d][d] = 0.5 / mesh.getMeshSpacing(d);
      51                 :             :         }
      52         [ +  - ]:          24 :         return detail::meta_div<Field>(u, vectors);
      53   [ +  +  -  - ]:          54 :     }
      54                 :             : 
      55                 :             :     /*!
      56                 :             :      * User interface of Laplacian
      57                 :             :      * @param u field
      58                 :             :      */
      59                 :             :     template <typename Field>
      60                 :          12 :     detail::meta_laplace<Field> laplace(Field& u) {
      61                 :          12 :         constexpr unsigned Dim = Field::dim;
      62                 :             : 
      63         [ +  - ]:          12 :         u.fillHalo();
      64                 :          12 :         BConds<Field, Dim>& bcField = u.getFieldBC();
      65         [ +  - ]:          12 :         bcField.apply(u);
      66                 :             : 
      67                 :             :         using mesh_type = typename Field::Mesh_t;
      68                 :          12 :         mesh_type& mesh = u.get_mesh();
      69         [ +  - ]:          12 :         typename mesh_type::vector_type hvector(0);
      70         [ +  + ]:          54 :         for (unsigned d = 0; d < Dim; d++) {
      71         [ +  - ]:          42 :             hvector[d] = 1.0 / std::pow(mesh.getMeshSpacing(d), 2);
      72                 :             :         }
      73         [ +  - ]:          24 :         return detail::meta_laplace<Field>(u, hvector);
      74                 :          12 :     }
      75                 :             : 
      76                 :             :     /*!
      77                 :             :      * User interface of curl in three dimensions.
      78                 :             :      * @param u field
      79                 :             :      */
      80                 :             :     template <typename Field>
      81                 :           2 :     detail::meta_curl<Field> curl(Field& u) {
      82                 :           2 :         constexpr unsigned Dim = Field::dim;
      83                 :             : 
      84         [ +  - ]:           2 :         u.fillHalo();
      85                 :           2 :         BConds<Field, Dim>& bcField = u.getFieldBC();
      86         [ +  - ]:           2 :         bcField.apply(u);
      87                 :             : 
      88                 :             :         using mesh_type = typename Field::Mesh_t;
      89                 :           2 :         mesh_type& mesh = u.get_mesh();
      90                 :           2 :         typename mesh_type::vector_type xvector(0);
      91                 :           2 :         xvector[0] = 1.0;
      92                 :           2 :         typename mesh_type::vector_type yvector(0);
      93                 :           2 :         yvector[1] = 1.0;
      94                 :           2 :         typename mesh_type::vector_type zvector(0);
      95                 :           2 :         zvector[2] = 1.0;
      96                 :           2 :         typename mesh_type::vector_type hvector(0);
      97         [ +  - ]:           2 :         hvector = mesh.getMeshSpacing();
      98         [ +  - ]:           4 :         return detail::meta_curl<Field>(u, xvector, yvector, zvector, hvector);
      99                 :           2 :     }
     100                 :             : 
     101                 :             :     /*!
     102                 :             :      * User interface of Hessian in three dimensions.
     103                 :             :      * @param u field
     104                 :             :      */
     105                 :             :     template <typename Field>
     106                 :          12 :     detail::meta_hess<Field> hess(Field& u) {
     107                 :          12 :         constexpr unsigned Dim = Field::dim;
     108                 :             : 
     109         [ +  - ]:          12 :         u.fillHalo();
     110                 :          12 :         BConds<Field, Dim>& bcField = u.getFieldBC();
     111         [ +  - ]:          12 :         bcField.apply(u);
     112                 :             : 
     113                 :             :         using mesh_type   = typename Field::Mesh_t;
     114                 :             :         using vector_type = typename mesh_type::vector_type;
     115                 :             : 
     116                 :          12 :         mesh_type& mesh = u.get_mesh();
     117 [ #  # ][ +  -  :         108 :         vector_type vectors[Dim];
          +  +  -  -  -  
                      - ]
     118         [ +  + ]:          54 :         for (unsigned d = 0; d < Dim; d++) {
     119                 :          42 :             vectors[d]    = 0;
     120                 :          42 :             vectors[d][d] = 1;
     121                 :             :         }
     122         [ +  - ]:          12 :         auto hvector = mesh.getMeshSpacing();
     123                 :             : 
     124         [ +  - ]:          24 :         return detail::meta_hess<Field>(u, vectors, hvector);
     125   [ +  +  -  - ]:          66 :     }
     126                 :             : }  // namespace ippl
        

Generated by: LCOV version 2.0-1