diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..13566b81b018ad684f3a35fee301741b2734c8f4
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 8cb85cd3321e898f32131059be8845327d31cd0d..79b3c94830bab93d40d0770f2765540fe24ed423 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="CMakeWorkspace">
-    <contentRoot DIR="$PROJECT_DIR$" />
-  </component>
+  <component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
 </project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3ead05b20bc527af38eefccede65092aee728ba2
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/scm-io.iml" filepath="$PROJECT_DIR$/.idea/scm-io.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/scm-io.iml b/.idea/scm-io.iml
new file mode 100644
index 0000000000000000000000000000000000000000..f08604bb65b25149b195f9e9f282f9683a428592
--- /dev/null
+++ b/.idea/scm-io.iml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module classpath="CMake" type="CPP_MODULE" version="4" />
\ No newline at end of file
diff --git a/src/main.f90 b/src/main.f90
new file mode 100644
index 0000000000000000000000000000000000000000..062885d34180b3a62f14b25328bfdb0624cc262d
--- /dev/null
+++ b/src/main.f90
@@ -0,0 +1,15 @@
+program main
+    use netcdf_io_module
+    implicit none
+    type(io_struct) :: ios
+    real, dimension(10) :: time_data = (/1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0/)
+    real, dimension(10) :: series_data = (/10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0/)
+
+    call open_netcdf('series_data.nc', ios, 10)
+    if (ios%is_open) then
+        call write_series(ios, time_data, series_data)
+        call close_netcdf(ios)
+    else
+        print *, 'Failed to open NetCDF file.'
+    endif
+end program main
diff --git a/src/netcdf_io_module.f90 b/src/netcdf_io_module.f90
new file mode 100644
index 0000000000000000000000000000000000000000..2a467186f9197b5ecf77c7706665029172231e10
--- /dev/null
+++ b/src/netcdf_io_module.f90
@@ -0,0 +1,61 @@
+module netcdf_io_module
+    use netcdf
+    implicit none
+
+    type :: io_struct
+        integer :: ncid
+        integer :: time_dimid, varid_time, varid_series
+        logical :: is_open = .false.
+        character(len=128) :: series_name = 'timeseries of variable'
+        character(len=128) :: series_long_name = 'timeseries of some variable'
+        character(len=128) :: series_units = 'unit'
+    end type io_struct
+
+contains
+    subroutine open_netcdf(filename, ios, time_len)
+        character(len=*), intent(in) :: filename
+        type(io_struct), intent(out) :: ios
+        integer, intent(in) :: time_len
+        integer :: ierr
+
+        ierr = nf90_create(filename, nf90_clobber, ios%ncid)
+        if (ierr == nf90_noerr) then
+            ios%is_open = .true.
+            ierr = nf90_def_dim(ios%ncid, 'time', time_len, ios%time_dimid)
+            ierr = nf90_def_var(ios%ncid, 'time', nf90_float, ios%time_dimid, ios%varid_time)
+            ierr = nf90_def_var(ios%ncid, 'series', nf90_float, ios%time_dimid, ios%varid_series)
+            ierr = nf90_put_att(ios%ncid, ios%varid_series, 'standard_name', ios%series_name)
+            ierr = nf90_put_att(ios%ncid, ios%varid_series, 'long_name', ios%series_long_name)
+            ierr = nf90_put_att(ios%ncid, ios%varid_series, 'units', ios%series_units)
+            ierr = nf90_enddef(ios%ncid)
+        else
+            print *, 'Error opening file: ', ierr
+            ios%is_open = .false.
+        endif
+    end subroutine open_netcdf
+
+    subroutine write_series(ios, time_data, series_data)
+        type(io_struct), intent(in) :: ios
+        real, dimension(:), intent(in) :: time_data, series_data
+        integer :: ierr
+
+        if (.not. ios%is_open) then
+            print *, "File is not open."
+            return
+        endif
+
+        ierr = nf90_put_var(ios%ncid, ios%varid_time, time_data)
+        ierr = nf90_put_var(ios%ncid, ios%varid_series, series_data)
+        if (ierr /= nf90_noerr) then
+            print *, 'Error writing data:', ierr
+        endif
+    end subroutine write_series
+
+    subroutine close_netcdf(ios)
+        type(io_struct), intent(inout) :: ios
+        integer :: ierr
+
+        ierr = nf90_close(ios%ncid)
+        ios%is_open = .false.
+    end subroutine close_netcdf
+end module netcdf_io_module