From b386dc73b22814aae891809a4fa3232d5d6eea0d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 17 Oct 2019 07:46:20 +0200 Subject: [PATCH] enable to non-transposed tensor data usually, we store per data per cell, i.e. len(shape(x)) == 3 means x is a tensor. Due to the use of transposed tensors (due to column-major storage order in Fortran), we usually want to store the transpose of (3x3) tensors. Now the default can be changed --- src/element.f90 | 2 +- src/results.f90 | 24 +++++++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/element.f90 b/src/element.f90 index 8fb7d4c8b..02f5fb762 100644 --- a/src/element.f90 +++ b/src/element.f90 @@ -753,7 +753,7 @@ subroutine tElement_init(self,elemType) self%cell = CELL10 end select - self%NcellNodesPerCell = NCELLNODEPERCELL(self%cellType) + self%NcellnodesPerCell = NCELLNODEPERCELL(self%cellType) select case(self%cellType) case(1) diff --git a/src/results.f90 b/src/results.f90 index 2498bf957..025f35602 100644 --- a/src/results.f90 +++ b/src/results.f90 @@ -296,21 +296,35 @@ end subroutine results_writeVectorDataset_real !-------------------------------------------------------------------------------------------------- !> @brief stores a tensor dataset in a group !-------------------------------------------------------------------------------------------------- -subroutine results_writeTensorDataset_real(group,dataset,label,description,SIunit) +subroutine results_writeTensorDataset_real(group,dataset,label,description,SIunit,transposed) character(len=*), intent(in) :: label,group,description character(len=*), intent(in), optional :: SIunit + logical, intent(in), optional :: transposed real(pReal), intent(in), dimension(:,:,:) :: dataset integer :: i + logical :: T integer(HID_T) :: groupHandle real(pReal), dimension(:,:,:), allocatable :: dataset_transposed + + if(present(transposed)) then + T = transposed + else + T = .true. + endif - allocate(dataset_transposed,mold=dataset) - do i=1,size(dataset,3) - dataset_transposed(1:3,1:3,i) = transpose(dataset(1:3,1:3,i)) - enddo + if(T) then + if(size(dataset_transposed,1) /= size(dataset_transposed,2)) & + call IO_error(0,ext_msg='transpose non-symmetric tensor') + allocate(dataset_transposed,mold=dataset) + do i=1,size(dataset_transposed,3) + dataset_transposed(:,:,i) = transpose(dataset(:,:,i)) + enddo + else + allocate(dataset_transposed,source=dataset) + endif groupHandle = results_openGroup(group)