From 44b9a9a118678f2897e4106e85092aa42c9cd858 Mon Sep 17 00:00:00 2001 From: Emmanuel Branlard Date: Mon, 21 Aug 2023 17:16:34 -0600 Subject: [PATCH] NWTC: adding tools for string manipulation --- modules/aerodyn/src/FVW.f90 | 1 - modules/aerodyn/src/FVW_IO.f90 | 48 +----- modules/nwtc-library/CMakeLists.txt | 1 + .../Old_test/Test_ChkRealFmtStr/makefile | 1 + .../Old_test/Test_FileSize/makefile | 1 + .../Old_test/Test_MeshMapping/Makefile | 1 + .../Old_test/Test_OpenCon_GnuWin/makefile | 1 + .../Old_test/Test_ReadComFile/makefile | 1 + modules/nwtc-library/src/NWTC_Library.f90 | 3 + modules/nwtc-library/src/NWTC_Str.f90 | 141 ++++++++++++++++++ modules/seastate/src/UserWaves.f90 | 16 -- modules/subdyn/src/SubDyn.f90 | 38 ----- modules/subdyn/src/SubDyn_Driver.f90 | 33 +--- vs-build/AeroDyn/AeroDyn_Driver.vfproj | 1 + .../AeroDyn_Inflow_c_binding.vfproj | 1 + vs-build/BeamDyn/BeamDyn.vfproj | 1 + vs-build/FASTlib/FASTlib.vfproj | 1 + vs-build/HydroDyn/HydroDynDriver.vfproj | 1 + .../HydroDyn_c_binding.vfproj | 1 + vs-build/InflowWind/InflowWind_driver.vfproj | 1 + .../InflowWind_c_binding.vfproj | 1 + vs-build/MoorDyn/MoorDynDriver.vfproj | 1 + .../MoorDyn_c_binding.vfproj | 1 + vs-build/SeaState/SeaStateDriver.vfproj | 1 + vs-build/SubDyn/SubDyn.vfproj | 1 + vs-build/TurbSim/TurbSim.vfproj | 1 + vs-build/UnsteadyAero/UnsteadyAero.vfproj | 1 + 27 files changed, 169 insertions(+), 131 deletions(-) create mode 100644 modules/nwtc-library/src/NWTC_Str.f90 diff --git a/modules/aerodyn/src/FVW.f90 b/modules/aerodyn/src/FVW.f90 index 616d96ffc7..4220b8c2b2 100644 --- a/modules/aerodyn/src/FVW.f90 +++ b/modules/aerodyn/src/FVW.f90 @@ -352,7 +352,6 @@ subroutine FVW_SetParametersFromInputs( InitInp, p, ErrStat, ErrMsg ) integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! Local variables - character(1024) :: rootDir, baseName ! Simulation root dir and basename integer(IntKi) :: iW, nBldMax integer(IntKi), allocatable :: nBldPerRot(:) integer(IntKi) :: ErrStat2 diff --git a/modules/aerodyn/src/FVW_IO.f90 b/modules/aerodyn/src/FVW_IO.f90 index bdbeb6b686..48580e578e 100644 --- a/modules/aerodyn/src/FVW_IO.f90 +++ b/modules/aerodyn/src/FVW_IO.f90 @@ -277,7 +277,7 @@ subroutine ReadGridOut(sLine, GridOut) ! Name GridOut%name =StrArray(1) ! Type - if (.not. is_int (StrArray(2), GridOut%type ) ) then + if (.not. is_integer(StrArray(2), GridOut%type ) ) then ErrMsg2=trim(ErrMsg2)//NewLine//'GridType needs to be an integer.' return endif @@ -317,15 +317,15 @@ subroutine ReadGridOut(sLine, GridOut) ErrMsg2='Error reading OLAF "x" inputs for grid outputs line: '//trim(sLine) if (.not. is_numeric(StrArray( 6), GridOut%xStart) ) return if (.not. is_numeric(StrArray( 7), GridOut%xEnd ) ) return - if (.not. is_int (StrArray( 8), GridOut%nx ) ) return + if (.not. is_integer(StrArray( 8), GridOut%nx ) ) return ErrMsg2='Error reading OLAF "y" inputs for grid outputs line: '//trim(sLine) if (.not. is_numeric(StrArray( 9), GridOut%yStart) ) return if (.not. is_numeric(StrArray(10), GridOut%yEnd ) ) return - if (.not. is_int (StrArray(11), GridOut%ny ) ) return + if (.not. is_integer(StrArray(11), GridOut%ny ) ) return ErrMsg2='Error reading OLAF "z" inputs for grid outputs line: '//trim(sLine) if (.not. is_numeric(StrArray(12), GridOut%zStart) ) return if (.not. is_numeric(StrArray(13), GridOut%zEnd ) ) return - if (.not. is_int (StrArray(14), GridOut%nz ) ) return + if (.not. is_integer(StrArray(14), GridOut%nz ) ) return ! Success ErrStat2=ErrID_None ErrMsg2='' @@ -333,46 +333,6 @@ end subroutine ReadGridOut END SUBROUTINE FVW_ReadInputFile -function is_numeric(string, x) - implicit none - character(len=*), intent(in) :: string - real(reki), intent(out) :: x - logical :: is_numeric - integer :: e,n - character(len=12) :: fmt - x = 0.0_reki - n=len_trim(string) - - if (n==0) then ! blank lines shouldn't be valid numbers - is_numeric = .false. - return - end if - - write(fmt,'("(F",I0,".0)")') n - read(string,fmt,iostat=e) x - is_numeric = e == 0 -end function is_numeric - -function is_int(string, x) - implicit none - character(len=*), intent(in) :: string - integer(IntKi), intent(out) :: x - logical :: is_int - integer :: e,n - character(len=12) :: fmt - x = 0 - n=len_trim(string) - - if (n==0) then ! blank lines shouldn't be valid integers - is_int = .false. - return - end if - - write(fmt,'("(I",I0,")")') n - read(string,fmt,iostat=e) x - is_int = e == 0 -end function is_int - !================================================= !> Export FVW variables to VTK diff --git a/modules/nwtc-library/CMakeLists.txt b/modules/nwtc-library/CMakeLists.txt index 81a39fc2a0..88d3d70f99 100644 --- a/modules/nwtc-library/CMakeLists.txt +++ b/modules/nwtc-library/CMakeLists.txt @@ -68,6 +68,7 @@ set(NWTCLIBS_SOURCES src/NWTC_IO.f90 src/NWTC_Library.f90 src/NWTC_Num.f90 + src/NWTC_Str.f90 src/NWTC_RandomNumber.f90 src/NWTC_Library_Types.f90 diff --git a/modules/nwtc-library/Old_test/Test_ChkRealFmtStr/makefile b/modules/nwtc-library/Old_test/Test_ChkRealFmtStr/makefile index a860779ef4..d9f08f6b99 100644 --- a/modules/nwtc-library/Old_test/Test_ChkRealFmtStr/makefile +++ b/modules/nwtc-library/Old_test/Test_ChkRealFmtStr/makefile @@ -60,6 +60,7 @@ LIB_SOURCES = \ $(SYS_FILE).f90 \ NWTC_IO.f90 \ NWTC_Num.f90 \ + NWTC_Str.f90 \ ModMesh.f90 \ NWTC_Aero.f90 \ NWTC_Library.f90 diff --git a/modules/nwtc-library/Old_test/Test_FileSize/makefile b/modules/nwtc-library/Old_test/Test_FileSize/makefile index 4f80a02b5b..ed11ecbb70 100644 --- a/modules/nwtc-library/Old_test/Test_FileSize/makefile +++ b/modules/nwtc-library/Old_test/Test_FileSize/makefile @@ -83,6 +83,7 @@ LIB_SOURCES = \ $(SYS_FILE).f90 \ NWTC_IO.f90 \ NWTC_Num.f90 \ + NWTC_Str.f90 \ ModMesh_Types.f90 \ ModMesh.f90 \ NWTC_Aero.f90 \ diff --git a/modules/nwtc-library/Old_test/Test_MeshMapping/Makefile b/modules/nwtc-library/Old_test/Test_MeshMapping/Makefile index b05f1e0384..7f140ed1bb 100644 --- a/modules/nwtc-library/Old_test/Test_MeshMapping/Makefile +++ b/modules/nwtc-library/Old_test/Test_MeshMapping/Makefile @@ -89,6 +89,7 @@ LIB_SOURCES = \ NWTC_Base.f90 \ $(SYS_FILE).f90 \ NWTC_IO.f90 \ + NWTC_Str.f90 \ NWTC_Library_Types.f90 \ ModMesh_Types.f90 \ ModMesh.f90 \ diff --git a/modules/nwtc-library/Old_test/Test_OpenCon_GnuWin/makefile b/modules/nwtc-library/Old_test/Test_OpenCon_GnuWin/makefile index b13650471d..2db544c819 100644 --- a/modules/nwtc-library/Old_test/Test_OpenCon_GnuWin/makefile +++ b/modules/nwtc-library/Old_test/Test_OpenCon_GnuWin/makefile @@ -60,6 +60,7 @@ LIB_SOURCES = \ $(SYS_FILE).f90 \ NWTC_IO.f90 \ NWTC_Num.f90 \ + NWTC_Str.f90 \ ModMesh.f90 \ NWTC_Aero.f90 \ NWTC_Library.f90 diff --git a/modules/nwtc-library/Old_test/Test_ReadComFile/makefile b/modules/nwtc-library/Old_test/Test_ReadComFile/makefile index 86dde6dcf2..c79e6d1036 100644 --- a/modules/nwtc-library/Old_test/Test_ReadComFile/makefile +++ b/modules/nwtc-library/Old_test/Test_ReadComFile/makefile @@ -80,6 +80,7 @@ LIB_SOURCES = \ $(SYS_FILE).f90 \ NWTC_IO.f90 \ NWTC_Num.f90 \ + NWTC_Str.f90 \ ModMesh_Types.f90 \ ModMesh.f90 \ NWTC_Library.f90 diff --git a/modules/nwtc-library/src/NWTC_Library.f90 b/modules/nwtc-library/src/NWTC_Library.f90 index 9772468d1b..86297cf5ae 100644 --- a/modules/nwtc-library/src/NWTC_Library.f90 +++ b/modules/nwtc-library/src/NWTC_Library.f90 @@ -29,6 +29,7 @@ MODULE NWTC_Library ! NWTC_Library.f90 ! NWTC_Library_Types.f90 ! NWTC_Num.f90 + ! NWTC_Str.f90 ! ModMesh.f90 ! ModMesh_Types.f90 ! @@ -51,6 +52,7 @@ MODULE NWTC_Library ! NWTC_Library_Types.f90 ! NWTC_IO.f90 ! NWTC_Num.f90 + ! NWTC_Str.f90 ! ModMesh_Types.f90 ! ModMesh.f90 ! ModMesh_Mapping.f90 (remove if compiling with -DNO_MESHMAPPING) @@ -73,6 +75,7 @@ MODULE NWTC_Library USE NWTC_Library_Types USE NWTC_Num ! technically we don't need to specify this if we have ModMesh (because ModMesh USEs NWTC_Num) + USE NWTC_Str ! String utils USE ModMesh USE ModReg diff --git a/modules/nwtc-library/src/NWTC_Str.f90 b/modules/nwtc-library/src/NWTC_Str.f90 new file mode 100644 index 0000000000..a64eca9691 --- /dev/null +++ b/modules/nwtc-library/src/NWTC_Str.f90 @@ -0,0 +1,141 @@ +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2013-2016 National Renewable Energy Laboratory +! +! This file is part of the NWTC Subroutine Library. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +!********************************************************************************************************************************** + +!> This module contains string manipulation routines +MODULE NWTC_Str + + use Precision ! ProgDesc and other types with copy and other routines for those types + + implicit none + + interface is_numeric + module procedure is_numericR4 + module procedure is_numericR8 + end interface + +CONTAINS + + + +!> Count number of occurence of a substring in an input string. +function countsubstring(s1, s2) result(c) + character(len=*), intent(in) :: s1 !< Input string + character(len=*), intent(in) :: s2 !< string to be searched + integer :: c !< number of substrings + integer :: p, posn + c = 0 + if(len(s2) == 0) return + p = 1 + do + posn = index(s1(p:), s2) + if(posn == 0) return + c = c + 1 + p = p + posn + len(s2) + end do +end function countsubstring + +!> split a string according to a delimiter of size 1 +subroutine strsplit(String, StrArray, delimiter) + character(len=*),intent(in) :: String + character(len=1),intent(in) :: delimiter + character(1024), intent(out), allocatable :: StrArray(:) ! Array of strings extracted from line + ! Variable + integer :: j, k, l, n, nmax + logical :: EndOfLine + ! Find number of occurences + n = countsubstring(String, delimiter) + nmax = n+1 + ! Allocate substrings + if(allocated(StrArray)) deallocate(StrArray) + allocate(StrArray(nmax)) + StrArray(:)='' + ! Loop on string and store splits + n = 0 + k = 1 + l = len_trim(string) + EndOfLine = l-k < 0 + do while (.not.EndOfLine) + j = index(string(k:l),delimiter) + if (j == 0) then + j = l + 1 + else + j = j + k - 1 + end if + n = n + 1 + if(n==nmax) then + StrArray(n) = String(k:len(String)) + EndOfLine = .true. + else + if (j /= k .and. len_trim(string(k:j-1)) /= 0) StrArray(n) = String(k:j-1) + k = j + 1 + EndOfLine = l-k < 0 + endif + end do +end subroutine strsplit + +!> Return true if string is an integer, and also return the integer +logical function is_integer(string, x) + character(len=*), intent(in ) :: string + integer(IntKi), intent(out) :: x + integer :: e, n + x = 0 + n=len_trim(string) + if (n==0) then ! blank lines shouldn't be valid integers + is_integer = .false. + return + end if + read(string,*,iostat=e) x + is_integer = e == 0 +end function is_integer + +logical function is_numericR4(string, x) result(is_numeric) + character(len=*), intent(in ) :: string + real(SiKi), intent(out) :: x + integer :: e,n + character(len=12) :: fmt + x = 0.0_ReKi + n=len_trim(string) + write(fmt,'("(F",I0,".0)")') n + read(string,fmt,iostat=e) x + is_numeric = e == 0 +end function is_numericR4 + +logical function is_numericR8(string, x) result(is_numeric) + character(len=*), intent(in ) :: string + real(R8Ki), intent(out) :: x + integer :: e,n + character(len=12) :: fmt + x = 0.0_ReKi + n=len_trim(string) + write(fmt,'("(F",I0,".0)")') n + read(string,fmt,iostat=e) x + is_numeric = e == 0 +end function is_numericR8 + +logical function is_logical(string, b) + character(len=*), intent(in ) :: string + logical, intent(out) :: b + integer :: e,n + b = .false. + n=len_trim(string) + read(string,*,iostat=e) b + is_logical = e == 0 +end function is_logical + +END MODULE NWTC_Str diff --git a/modules/seastate/src/UserWaves.f90 b/modules/seastate/src/UserWaves.f90 index 122dde24af..14f091f231 100644 --- a/modules/seastate/src/UserWaves.f90 +++ b/modules/seastate/src/UserWaves.f90 @@ -1236,20 +1236,4 @@ SUBROUTINE ReadRealNumber(UnitNum, FileName, VarName, VarRead, StrRead, IsRealNu RETURN END SUBROUTINE ReadRealNumber - -FUNCTION is_numeric(string, x) - IMPLICIT NONE - CHARACTER(len=*), INTENT(IN) :: string - REAL(SiKi), INTENT(OUT) :: x - LOGICAL :: is_numeric - - INTEGER :: e,n - CHARACTER(len=12) :: fmt - x = 0.0_SiKi - n=LEN_TRIM(string) - WRITE(fmt,'("(F",I0,".0)")') n - READ(string,fmt,IOSTAT=e) x - is_numeric = e == 0 -END FUNCTION is_numeric - END MODULE UserWaves diff --git a/modules/subdyn/src/SubDyn.f90 b/modules/subdyn/src/SubDyn.f90 index 1258379d05..d099159164 100644 --- a/modules/subdyn/src/SubDyn.f90 +++ b/modules/subdyn/src/SubDyn.f90 @@ -4170,44 +4170,6 @@ SUBROUTINE SymMatDebug(M,MAT) END SUBROUTINE SymMatDebug -FUNCTION is_numeric(string, x) - IMPLICIT NONE - CHARACTER(len=*), INTENT(IN) :: string - REAL(ReKi), INTENT(OUT) :: x - LOGICAL :: is_numeric - INTEGER :: e,n - CHARACTER(len=12) :: fmt - x = 0.0_ReKi - n=LEN_TRIM(string) - WRITE(fmt,'("(F",I0,".0)")') n - READ(string,fmt,IOSTAT=e) x - is_numeric = e == 0 -END FUNCTION is_numeric - -FUNCTION is_integer(string, x) - IMPLICIT NONE - CHARACTER(len=*), INTENT(IN) :: string - INTEGER(IntKi), INTENT(OUT) :: x - LOGICAL :: is_integer - INTEGER :: e, n - x = 0 - n=LEN_TRIM(string) - READ(string,*,IOSTAT=e) x - is_integer = e == 0 -END FUNCTION is_integer - -FUNCTION is_logical(string, b) - IMPLICIT NONE - CHARACTER(len=*), INTENT(IN) :: string - Logical, INTENT(OUT) :: b - LOGICAL :: is_logical - INTEGER :: e,n - b = .false. - n=LEN_TRIM(string) - READ(string,*,IOSTAT=e) b - is_logical = e == 0 -END FUNCTION is_logical - !> Parses a file for Kxx,Kxy,..Kxthtx,..Kxtz, Kytx, Kyty,..Kztz SUBROUTINE ReadSSIfile ( Filename, JointID, SSIK, SSIM, ErrStat, ErrMsg, UnEc ) USE NWTC_IO diff --git a/modules/subdyn/src/SubDyn_Driver.f90 b/modules/subdyn/src/SubDyn_Driver.f90 index de2bb6e880..6a61048b35 100644 --- a/modules/subdyn/src/SubDyn_Driver.f90 +++ b/modules/subdyn/src/SubDyn_Driver.f90 @@ -444,7 +444,7 @@ subroutine readAppliedForce(Line, AL, PriPath, Errstat, ErrMsg) ErrStat=ErrID_Fatal ErrMsg='Error reading force inputs.'//char(10)//'Prolematic line: '//trim(Line) ! NodeID - if (.not. is_int(StrArray(1), AL%NodeID) ) then + if (.not. is_integer(StrArray(1), AL%NodeID) ) then ErrMsg=trim(ErrMsg)//achar(13)//achar(10)//'NodeID needs to be an integer.' return endif @@ -487,37 +487,6 @@ subroutine LegacyWarning(Message) call WrScr('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') end subroutine LegacyWarning - ! -------------------------------------------------------------------------------- - ! --- Generic routines (also present in other modules, e.g. OLAF, AD Driver) - ! -------------------------------------------------------------------------------- - function is_numeric(string, x) - implicit none - character(len=*), intent(in) :: string - real(reki), intent(out) :: x - logical :: is_numeric - integer :: e,n - character(len=12) :: fmt - x = 0.0_reki - n=len_trim(string) - write(fmt,'("(F",I0,".0)")') n - read(string,fmt,iostat=e) x - is_numeric = e == 0 - end function is_numeric - - function is_int(string, x) - implicit none - character(len=*), intent(in) :: string - integer(IntKi), intent(out) :: x - logical :: is_int - integer :: e,n - character(len=12) :: fmt - x = 0 - n=len_trim(string) - write(fmt,'("(I",I0,")")') n - read(string,fmt,iostat=e) x - is_int = e == 0 - end function is_int - !> Read a delimited file with one line of header subroutine ReadDelimFile(Filename, nCol, Array, errStat, errMsg, nHeaderLines, priPath) character(len=*), intent(in) :: Filename diff --git a/vs-build/AeroDyn/AeroDyn_Driver.vfproj b/vs-build/AeroDyn/AeroDyn_Driver.vfproj index 8b22a773b2..9ef8be77f4 100644 --- a/vs-build/AeroDyn/AeroDyn_Driver.vfproj +++ b/vs-build/AeroDyn/AeroDyn_Driver.vfproj @@ -798,6 +798,7 @@ + diff --git a/vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.vfproj b/vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.vfproj index e1b544cdf7..27a5e70066 100644 --- a/vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.vfproj +++ b/vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.vfproj @@ -1015,6 +1015,7 @@ + diff --git a/vs-build/BeamDyn/BeamDyn.vfproj b/vs-build/BeamDyn/BeamDyn.vfproj index e5a72c25eb..a13f410c99 100644 --- a/vs-build/BeamDyn/BeamDyn.vfproj +++ b/vs-build/BeamDyn/BeamDyn.vfproj @@ -269,6 +269,7 @@ + diff --git a/vs-build/FASTlib/FASTlib.vfproj b/vs-build/FASTlib/FASTlib.vfproj index b62392c0f7..dd553bdf15 100644 --- a/vs-build/FASTlib/FASTlib.vfproj +++ b/vs-build/FASTlib/FASTlib.vfproj @@ -1976,6 +1976,7 @@ + diff --git a/vs-build/HydroDyn/HydroDynDriver.vfproj b/vs-build/HydroDyn/HydroDynDriver.vfproj index 961854b6bb..dbd915c8ee 100644 --- a/vs-build/HydroDyn/HydroDynDriver.vfproj +++ b/vs-build/HydroDyn/HydroDynDriver.vfproj @@ -436,6 +436,7 @@ + diff --git a/vs-build/HydroDyn_c_binding/HydroDyn_c_binding.vfproj b/vs-build/HydroDyn_c_binding/HydroDyn_c_binding.vfproj index e7464b083b..d529236a29 100644 --- a/vs-build/HydroDyn_c_binding/HydroDyn_c_binding.vfproj +++ b/vs-build/HydroDyn_c_binding/HydroDyn_c_binding.vfproj @@ -297,6 +297,7 @@ + diff --git a/vs-build/InflowWind/InflowWind_driver.vfproj b/vs-build/InflowWind/InflowWind_driver.vfproj index ceb7f5b44f..0f4daf36ba 100644 --- a/vs-build/InflowWind/InflowWind_driver.vfproj +++ b/vs-build/InflowWind/InflowWind_driver.vfproj @@ -226,6 +226,7 @@ + diff --git a/vs-build/InflowWind_c_binding/InflowWind_c_binding.vfproj b/vs-build/InflowWind_c_binding/InflowWind_c_binding.vfproj index 49bd328500..f1cd6a33de 100644 --- a/vs-build/InflowWind_c_binding/InflowWind_c_binding.vfproj +++ b/vs-build/InflowWind_c_binding/InflowWind_c_binding.vfproj @@ -222,6 +222,7 @@ + diff --git a/vs-build/MoorDyn/MoorDynDriver.vfproj b/vs-build/MoorDyn/MoorDynDriver.vfproj index 42279628c3..7dba18e7fa 100644 --- a/vs-build/MoorDyn/MoorDynDriver.vfproj +++ b/vs-build/MoorDyn/MoorDynDriver.vfproj @@ -223,6 +223,7 @@ + diff --git a/vs-build/MoorDyn_c_binding/MoorDyn_c_binding.vfproj b/vs-build/MoorDyn_c_binding/MoorDyn_c_binding.vfproj index 6d2f237551..b70d760c32 100644 --- a/vs-build/MoorDyn_c_binding/MoorDyn_c_binding.vfproj +++ b/vs-build/MoorDyn_c_binding/MoorDyn_c_binding.vfproj @@ -245,6 +245,7 @@ + diff --git a/vs-build/SeaState/SeaStateDriver.vfproj b/vs-build/SeaState/SeaStateDriver.vfproj index 0de503b1af..9e70cc86e9 100644 --- a/vs-build/SeaState/SeaStateDriver.vfproj +++ b/vs-build/SeaState/SeaStateDriver.vfproj @@ -199,6 +199,7 @@ + diff --git a/vs-build/SubDyn/SubDyn.vfproj b/vs-build/SubDyn/SubDyn.vfproj index 188f4cca03..fb5db9d8af 100644 --- a/vs-build/SubDyn/SubDyn.vfproj +++ b/vs-build/SubDyn/SubDyn.vfproj @@ -164,6 +164,7 @@ + diff --git a/vs-build/TurbSim/TurbSim.vfproj b/vs-build/TurbSim/TurbSim.vfproj index 1f07d1efd5..7b22a12bac 100644 --- a/vs-build/TurbSim/TurbSim.vfproj +++ b/vs-build/TurbSim/TurbSim.vfproj @@ -62,6 +62,7 @@ + diff --git a/vs-build/UnsteadyAero/UnsteadyAero.vfproj b/vs-build/UnsteadyAero/UnsteadyAero.vfproj index afc6eb7f96..d6f998afb1 100644 --- a/vs-build/UnsteadyAero/UnsteadyAero.vfproj +++ b/vs-build/UnsteadyAero/UnsteadyAero.vfproj @@ -271,6 +271,7 @@ +